1
HDL语言及源代码
VHDL是一种应用广泛的硬件描述语言,设计者可以通过它编写代码,通过模拟器仿真验证其功能,完成逻辑综合与逻辑优化,最后通过下载到相应的可编程逻辑器件(如FPGA)中来实现设计。本设计是利用Quartus II软件,采用VHDL语言设计一个用8个开关对应8个数字显示。按sw0到sw7可以显示1到8的数值,并在选择开关时发出声响。完成后下载到实验箱,实现设计功能。
Max+plus II 作为Altera的上一代PLD设计软件,由于其出色的易用性而得到了广泛的应用。目前Altera已经停止了对Max+plus II 的更新支持。Quartus II 是Altera公司继Max+plus II之后开发的一种针对其公司生产的系列CPLD/PGFA器件的综合性开发软件,它的版本不断升级,从4.0版到10.0版,该软件有如下几个显著的特点:
该软件界面友好,使用便捷,功能强大,是一个完全集成化的可编程逻辑设计环境,是先进的EDA工具软件。该软件具有开放性、与结构无关、多平台、完全集成化、丰富的设计库、模块化工具等特点,支持原理图、VHDL、VerilogHDL以及AHDL(Altera Hardware Description Language)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。
Quartus II可以在XP、Linux以及Unix上使用,除了可以使用Tcl脚本完成设计流程外,提供了完善的用户图形界面设计方式。具有运行速度快,界面统一,功能集中,易学易用等特点。
Quartus II支持Altera公司的MAX 3000A系列、MAX 7000系列、MAX 9000系列、ACEX 1K系列、APEX 20K系列、APEX II系列、FLEX 6000系列、FLEX 10K系列,支持MAX7000/MAX3000等乘积项器件。支持MAX II CPLD系列、Cyclone系列、Cyclone II、Stratix II系列、Stratix GX系列等。支持IP核,包含了LPM/MegaFunction宏功能模块库,用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。此外,Quartus II 通过和DSP Builder工具与Matlab/Simulink相结合,可以方便地实现各种DSP应用系统;支持Altera的片上可编程系统(SOPC)开发,集系统级设计、嵌入式软件开发、可编程逻辑设计于一体,是一种综合性的开发平台。
对第三方EDA工具的良好支持也使用户可以在设计流程的各个阶段使用熟悉的第三放EDA工具。
Altera的Quartus II可编程逻辑软件属于第四代PLD开发平台。该平台支持一个工作组环境下的设计要求,其中包括支持基于Internet的协作设计。Quartus平台与Cadence、ExemplarLogic、 MentorGraphics、Synopsys和Synplicity等EDA供应商的开发工具相兼容。改进了软件的LogicLock模块设计功能,增添 了FastFit编译选项,推进了网络编辑性能,而且提升了调试能力。
在传统的硬件电路设计中,主要的设计文件是电路原理图,而采用HDL设计系统硬件电路时主要使用HDL编写源程序。所谓硬件描述语言HDL(HardwareDes cription Language),就是该语言可以描述硬件电路的功能,信号连接关系及定时关系。许多公司开发了自己专有的HDL,包括Zycad公司的ISP,Gateway DesignAutomation公司的Verilog以及Mentor Graphics公司的BLM。其中,Silicon Compiler公司的M及Gateway公司的Verilog以C语言为基础。UDL/I在日本以标准HDL的形式出现。多年来设计者一直使用这些专用的HDL。1982年,各ASIC芯片厂商相继开发了用于各自目的的HDL。1987年底,IEEE确认美国国防部开发的VHDL为标准硬件描述语言(IEEE.1076)。之后,各EDA公司研制的硬件电路设计工具逐渐向VHDL靠拢,VHDL在电子设计领域得到广泛的接受,1993年,IEEE对VHDL进行了修订,公布了新版本的VHDL(即IEEE.1076.1993)。现在,VHDL和Verilog作为IEEE的工业标准硬件描述语言,在电子工程领域,从各公司的设计人员到各大学的教授、学生,都极其重视对其的学习研究,VHDL已成为事实上的通用硬件描述语言。有专家认为,在21世纪中,几乎全部的数字系统设计任务将由VHDL与Verilog语言承担,VHDL将是电子工程设计人员的必备知识。VHDL和其他语言相比,最大的区别在于设计方法上的差别。
(1)VHDL支持自顶至下的和基于库的设计方法,而且支持同步电路、异步电路、现场可编程门阵列器件FPGA(field programmable gate array)以及其他随机电路的设计。VHDL具有比其他硬件描述语言更强的行为描述能力,基于抽象的行为描述风格避开了具体的器件结构,使设计人员能从逻辑行为上描述和设计大规模电子系统。目前流行的EDA工具和VHDL综合器大都能实现行为描述到RTL(Register Transfer Level)描述的转换。
(2)VHDL语句的行为描述能力和程序结构决定了它具有支持大规模设计的分解和已有设计再利用的功能,它支持系统的数学模型直到门级电路的描述,并且高层次的行为描述与低层次的门级电路描述、结构描述可以混合使用。这些特点符合IC设计的市场要求。VHDL支持系统级描述,这是它优于其他VHDL的最重要的特点。例如,Verilog语言是一种门级电路描述语言,其风格接近于电路原理图,设计者需要搞清楚具体的电路结构的细节,因此工作量通常较大。VHDL语言却最适合于描述电路的行为,即描述电路的功能,然后由综合器来生成符合要求的电路网络。设计者在熟悉基本单元电路的描述风格,积累一定的设计经验后,就会为用VHDL设计同等性能电路的高效率所鼓舞。
(3)VHDL的硬件描述与具体的工艺技术和硬件结构无关,当门级或门级以上的描述通过仿真检验后,再利用相应的工具将设计映射成不同的工艺,因此电路的设计与工艺的改变是相互独立的。彼此的改变不会产生不良影响,并且VHDL硬件描述语言的实现目标器件的选择范围广泛,可使用各系列的CPLD、FPGA及各种门阵列器件。
(4)VHDL具有类属描述语句和子程序调用等功能,对于己完成的设计源程序,可以通过修改类属参数表和函数的办法来改变设计的规模和结构。VHDL具有丰富的仿真语句和库函数,使得门电路级的功能仿真、检查成为可能,使设计者对整个工程设计的结构和功能的可行性做出决策。
(5)VHDL作为一种IEEE的工业标准,使VHDL的设计成果便于重复利用和交流。这就更进一步推动了VHDL语言的推广及完善。另外,由于其语法严格,给阅读和使用带来极大的便利。
本设计硬件平台采用武汉理工大学EDA实验箱,如下图所示。
所用到的部分有LED数码管、开关、蜂鸣器等,具体连接如下。
data_o[0] PIN_103 key[0] PIN_49
data_o[1] PIN_100 key[1] PIN_50
data_o[2] PIN_99 key[2] PIN_51
data_o[3] PIN_98 key[3] PIN_52
data_o[4] PIN_97 key[4] PIN_53
data_o[5] PIN_96 key[5] PIN_54
data_o[6] PIN_94 key[6] PIN_55
data_o[7] PIN_91 key[7] PIN_56
l[0] PIN_83 clk PIN_16
l[1] PIN_84 bell PIN_78
l[2] PIN_85
其中data_o[0]—data_o[7]为每个LED数码管0-7的段选,key[0]—key[7]为控制开关0-7,l[0]—l[3]控制8个LED数码管,clk为时钟输入,bell为蜂鸣器
本设计的VHDL程序主要有共有3个部分:分频、数码管扫描进程、显示控制进程。方案原理图如下。
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY key IS
PORT(clk : IN STD_LOGIC;
key : in std_logic_vector(7 downto 0);
l : out STD_LOGIC_VECTOR(2 downto 0);
data_o : out STD_LOGIC_VECTOR(7 downto 0);
bell : out STD_LOGIC:=‘0’
);
END key;
ARCHITECTURE an OF key IS
signal clk_1k : std_logic;
signal p : integer range 0 to 7;
begin
process(clk)
variable cnt1 : integer range 0 to 200;
variable cnt2 : integer range 0 to 125;
begin
if clk‘event and clk=’1‘ then
if cnt1=200 then
cnt1:=0;
if cnt2=125 then
cnt2:=0;
clk_1k《=not clk_1k;
else
cnt2:=cnt2+1;
end if;
else
cnt1:=cnt1+1;
end if;
end if;
end process;
process(p,clk_1k)
begin
if clk_1k=’1‘ and clk_1k’event then
if p=7 then
p《=0;
else
p《=p+1;
end if;
end if;
case p is
when 0 =》 l《=“000”;
when 1 =》 l《=“001”;
when 2 =》 l《=“010”;
when 3 =》 l《=“011”;
when 4 =》 l《=“100”;
when 5 =》 l《=“101”;
when 6 =》 l《=“110”;
when 7 =》 l《=“111”;
when others=》
end case;
end process;
process(clk_1k)
FUNCTION b_to_s7(bcd8421:INTEGER RANGE 0 TO 9) RETURN STD_LOGIC_VECTOR IS
VARIABLE smg7: STD_LOGIC_VECTOR(7 DOWNTO 0);
BEGIN
CASE bcd8421 IS
WHEN 0 =》 smg7:=“11111100”;
WHEN 1 =》 smg7:=“01100000”;
WHEN 2 =》 smg7:=“11011010”;
WHEN 3 =》 smg7:=“11110010”;
WHEN 4 =》 smg7:=“01100110”;
WHEN 5 =》 smg7:=“10110110”;
WHEN 6 =》 smg7:=“10111110”;
WHEN 7 =》 smg7:=“11100000”;
WHEN 8 =》 smg7:=“11111110”;
WHEN 9 =》 smg7:=“11110110”;
END CASE;
RETURN smg7;
END b_to_s7;
begin
if clk_1k=‘1’ then
case key is
when “11111111”=》bell《=‘0’;
when “11111110”=》 data_o《=b_to_s7(1);bell《=‘1’;
when “11111101”=》data_o《=b_to_s7(2);bell《=‘1’;
when “11111011”=》data_o《=b_to_s7(3);bell《=‘1’;
when “11110111”=》data_o《=b_to_s7(4);bell《=‘1’;
when “11101111”=》data_o《=b_to_s7(5);bell《=‘1’;
when “11011111”=》data_o《=b_to_s7(6);bell《=‘1’;
when “10111111”=》data_o《=b_to_s7(7);bell《=‘1’;
when “01111111”=》data_o《=b_to_s7(8);bell《=‘1’;
when others=》data_o《=“10001111”;bell《=‘1’;
end case;
end if;
end process;
end an;
所编写程序经过下载到所用实验箱后,当分别拨动开关sw0—sw7时,在LED数码管上分别显示数字1—8,并且蜂鸣器发出声响,有关部分运行结果的如下图所示。
全部0条评论
快来发表一下你的评论吧 !