一、前言
课题研究的背景
随着信息技术获得了突飞猛进的发展,信息技术渗透了我们生活的几乎全部领域,改变着人类的生存状态和思维模式。而我们的课题所涉及的电子设计自动化(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,能够实现一个通道的采样控制;
c,计算转换后的数字电压信号,并以BCD码方式表示。
- 总体框图
方案一:
本利用ADC0809作为电压采样端口,FPGA作为系统的核心器件,用LED进行数码显示,把读取的8位二进制数据转换成便利于输出3位十进制BCD码送给数码管。
采用FPGA芯片作为系统的核心器件,负责ADC0809的A/D转换的启动、地址锁存、输入通道的选择、数据的读取。同时,把读取的8位二进制数据转换成便于输出3位十进制的BCD码送给数码管,以显示当前测量电压值。这些工作由ADC0809转换控制模块、数据转换模块、译码模块完成。
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;