AZ,az,0~9,以及下划线:“_”。VHDL不区分大小写。标识符必须以字母开头,不能以下划线为结尾,不能出现连续的两个或多个下划线。
常量赋予值后不改变,格式:
Constant 常量名:数据类型:=表达式;
变量是可以改变值的量,可以在进程和子程序中说明,可以是任意数据类型。变量的赋值是立即生效的,格式:
Variable 变量名:数据类型:=初始值或表达式;
信号是电子电路内部硬件连接的抽象,可以将结构体中分离的并行语句连接起来, 并且能通过端口与其他的模块连接。可以随着时间改变值,不想变量复制立即生效,允许产生时延。信号通常在实体、结构体和程序包中说明,但不能在进程中说明,只能在进程中使用。使用“<=”赋值,允许产生时延,使用“: =”不会有时延,格式:
Signal 信号名:数据类型:=初始值;
标准数据类型:
自定义数据类型:
IEEE标准数据类型std-logic和std-logic-vector:
标准逻辑位std-logic数据类型;
标准逻辑矢量std-logic-vector数据类型;
std-logic定义了9种不同的值:
VHDL超高速集成电路硬件描述语言
库是用VHDL语言编写的源程序及其通过编译的数据的集合,库由各种程序包组成,程序包提供了各种数据类型以及各种类型转换函数及运算符等,让设计着来使用。
语法格式:
Library 库名;
Use 库名.程序包.项目名;
举例说明:
library ieee;
use iee.std_logic_1164.all;
//用到了ieee库以及ieee库中的std_logic_1164程序包中的全部资源。
In输入类型 out输出类型 inout输入输出类型 buffer缓冲类型在结构体内部可做反馈
Linkage 无指定方向,可与任何方向的信号连接。
语法格式:
Entity 实体名 is
Port(端口名称1:端口方式1 端口类型1;
端口名称1: 端口方式2 端口类型2);
End 实体名;
语法格式:
Architecture 结构体名称 of实体名 is
结构体说明部分;
Begin
结构体并行语句部分;
end 结构体名称;
结构体名称:本结构体的命名。通常根据结构体的功能进行命名。
结构体说明部分:对结构体内部所使用的信号、常数、数据类型和函数进行定义
表达式是通过不同的操作符来连接多个操作数来完成算数或逻辑计算的式子
关系运算符的运算结果为布尔数据类型
并置运算符“&”可用于位的连接,形成位矢量
并置运算符可用于两个位矢量的链接构成更大的位矢量
操作符的运算优先顺序仅在同一行的情况下有顺序、有优先,不同行的操作符的运算有可能是同时的。
在VHDL中,只能在VHDL程序的并行部分进行信号说明(如在结构体的说明部分),但可以在VHDL程序的并行语句和顺序语句中同时使用。信号赋值的书写格式为:
目标信号<=表达式;
在VHDL综合功能,变量的说明和赋值语句只能在VHDL程序的顺序部分进行说明和使用,既只能出现在进程、过程和函数中。变量赋值语句的书写格式为:
目标变量:=表达式;
不同之处在于信号的的赋值语句有延迟。
在VHDL中,if语句是具有条件控制功能的语句他根据指定的条件及其条件是否成立的结果来确定语句的执行顺序。
书写格式:
if 条件 1 then
第一组顺序语句;
elsif 条件2 then
第二组顺序语句;
else
第n条顺序语句;
end if;
8线-3线优先编码器举例:
Library ieee;
Use iee.std_logic_1164.all;
Enity priorityencoder is
Port(input:in std_logic_vector(7 downto 0);
Y:out std_logic_vector(2 downto 0));
End priorityencoder;
Architecture rtl of priorityencoder is
Begin
Processs(input)
Begin
if input(0)=’0’ then
Y<=”111”;
elsif input(1)=’0’ then
Y<=”110”;
elsif input(2)=’0’ then
Y<=”101”;
elsif input(3)=’0’ then
Y<=”100”;
elsif input(4)=’0’ then
Y<=”011”;
elsif input(5)=’0’ then
Y<=”010”;
elsif input(6)=’0’ then
Y<=”001”;
else
Y<=”000”;
end if;
End process;
End rtl;
case语句是根据条件表达式的执行由符号“=>”所指的一组算徐语句。
语法格式:
case 条件表达式 is
when 条件表达式的值 =>一组顺序语句;
when others => 一组顺序语句;
end case;
If和case的不同:if语句是有序的,先处理最起使、最优先的条件,后处理次优先的条件。case语句是无序的,所有条件表达式的值都并行处理。case语句中的条件表达式的值必须列举穷尽,不可重复。不能穷尽的条件表达式用others表示。
for loop循环语句使程序进行有规则的循环。
书写格式:
循环标号:for 循环变量 in 范围 loop
顺序处理语句;
end loop 循环标号;
循环标号:for loop循环的标识符
循环变量:整数变量,循环变量的只在每次循环中都发生变化,自动递增或递减。循环变量不需要另加说明,在循环体中可读不可写。
范围:离散范围,是循环变量在循环过程中依次取值的氛围实际上限制了循环的次数。
在VHDL中,null语句用来表示一种占位置的空操作,他不进行任何操作,执行该语句只是使VHDL程序去执行下一个语句。经常用于case语句中,从而能满足case语句对条件选择值全部列举的要求。
进程语句包含在结构体中,一个结构体可以有很多个进程语句,多个进程语句间是并行的,并可访问结构体或实体中定义的信号。进程中的语句是顺序执行的。进程间的通讯是由信号来传递的。
语法如下:
标记:process(敏感信号表)
变量说明语句;
Begin
一组顺序语句;
End process 标记;
Library ieee;
Use ieee.std_logic_1164.all
entity dff1 is
port(clk,d:in std_logic;
q:out std_logic);
end dff1;
architecture rtl of dff1 is
begin
P1: process(Clk,d)
begin
if(clk’event and clk=’1’) then
q<=d;
end if;
end process p1;
end trl;
信号的赋值语句在进程内部出现时是顺序语句。信号赋值语句直接在结构体的进程之外出现时,它将作为一种并发语句的形式出现。
并发信号赋值语句靠时间来驱动,因此对于并发信号赋值语句来说,只有当赋值符号”<=”右边的对象有事件发生时才会执行该语句。
并发信号赋值语句常用于基本门电路、加法器、乘法器、除法器和比较器等基本逻辑电路进行描述。
一条并行信号赋值语句与含有信号赋值语句的进程是等价的,因此可以将一条并行吸信号赋值语句改写成等价的进程语句。
条件信号的赋值语句是一种并行描述语句。
书写格式如下:
目标信号<=表达式1 when 条件1 else
表达式2 when 条件2 else
表达式n;
相比于if语句,if语句是顺序描述语句,因此只能在进程内部使用,而条件信号赋值语句是并行描述,他需要在结构体中的进程之外使用。
对于if来说else可有可无,信号赋值语句中的else语句是必须有的。
If语句可以嵌套使用;而条件信号赋值语句是赋值语句,不能嵌套使用,因此不能生成锁存器。
根据选择条件的不同而将不同的表达式赋给目标信号的语句。是并行描述语句。
语法格式:
With 表达式 select
目标信号<=表达式1 when 选择条件1,
表达式2 when 选择条件2;
VHDL程序执行,是根据表达式的当前值来进行表达式的赋值操作。当表达式的值符合选择条件1时,将表达式1的值赋值给目标信号。
选择信号赋值语句于case语句一样,必须把表达式的值在条件中都列举出来。
举例说明:
Library ieee;
Use iee.std_logic_1164.all;
Entity mmux4 is
Port(d0,d1,d2,d3: in std_logic;
Sel:in std_logic_vector(1 doento 0);
Q:out std_logic);
End;
Architecture rtl of mmux4 is
Begin
With sel select
Q<= d0 when “00”,
d1 when ”01”,
d2 when ”10”,
d3 when others;
End rtl;
为了满足选择信号赋值语句中表达式的多幼稚必须被列出的语法规范,要使用others来代表其他所有可能的值。因为式并行语句不可在进程内部使用。
在设计复杂的数字电路(或说明数字电路系统)时,可以调用已经设计好的实体,这样使VHDL程序设计变得简单了。
调用的原件或者模块的说明采用component语句,他的作用就是在结构体的说明部分说明调用的元件或者模块,是原件说明语句。
书写格式:
component 调用的元件名
generic 参数说明;//可有可无
port 端口说明;
end component;
为了把调用的原件正确嵌入到高一层的结构体描述中,就必须把被调用的原件端口信号与结构体中相应端口信号正确的连接起来。这就是原件例化语句实现的功能。
书写格式:
标号名:元件名
Generic map(参数映射)
Port map(端口映射);
标号是唯一的。
端口映射两种方法:位置映射,名称映射。
主要用于模块化的设计中,优点是可以使用以前建立的元件或者模块,从而避免大量重复VHDL程序的编写。
众所周知,任何时序电路都以时钟信号为驱动,时序电路只是在时钟信号的边沿到来,其状态才发生改变。因此。时钟信号的通常是描述时序电路程序的执行条件。另外,时序电路也总是以时钟进程的形式来进行描述的。
当时钟信号作为进程的敏感信号时,在敏感信号的表中不能出现一个以上的时钟信号,除时钟信号以外,复位信号等是可以和时钟信号一起出现在敏感表中的
1、上升沿描述:
时钟的起始值为‘0’表示为clk’last_value=’0’;上升沿的到来表示发生了一个事件,用clk’event表示;上升沿以后,时钟信号当前的值为‘1’,故为clk=‘1’
简写为:
clk’event and clk=’1’
2、下降沿描述:
同理简写为:
clk’event and clk=’0’
所谓同步复位,就是当复位信号有效且在给定的时钟边沿到来时,触发器才被复位;
异步复位则是,一旦复位信号有效,触发器就被复位。
1、同步复位:
在用VHDL,描述时,同步复位一定在以时钟为敏感信号的进程中定义,且用if语句来描述必要的复位条件。
举例:
Library ieee;
Use ieee.std_logic_1164.all;
Entity dff1 is
Port(clk,clr,d:in std_logic;
Q:out std_logic);
End dff1;
Architecture rtl of dff1 is
Begin
Porcess(clk)
Begin
If(clk’evnet and clk=’1’)then
If(clr=’1’)then
Q<=’0’;
Else
Q<=d;
End if;
End if;
End process;
End rtl;
2、异步复位:
进程的敏感信号除了时钟信号外,还应加上复位信号;其次,用if描述复位条件;最后,在elsif段描述时钟信号沿的条件。
举例说明:
Library ieee;
Use ieee.std_logic_1164.all;
Entity dff1 is
Port(clk,clr,d:in std_logic;
Q:out std_logic);
End dff1;
Architecture rtl of dff1 is
Begin
Porcess(clk,clr)
Begin
If(clr=’1’)then
Q<=’0’;
elsIf(clk’evnet and clk=’1’)then
Q<=d;
End if;
End process;
End rtl;