第一节 数据部分
1.基本标识符:
AZ,az,0~以及下划线:_”。VHDL不区分大小写。标识符必须从字母开始,不能以下划线结束,不能连续两个或两个以上划线。
2.数据对象:
-
常量赋予值不变,格式:
Constant 常量名:数据类型:=表达式;
-
变量是可以改变值的量,可以在过程和子程序中解释,可以是任何数据类型。变量的赋值立即生效,格式:
Variable 变量名:数据类型:=初始值或表达式;
-
信号是电子电路内硬件连接的抽象,可以连接结构中分离的并行语句, 并且能通过端口与其他的模块连接。可着时间的推移,变量复制可以立即生效,允许延迟。信号通常在实体、结构体和程序包中说明,但不能在过程中说明,只能在过程中使用。使用“<=赋值,允许产生延迟,使用: =格式:
Signal 信号名:数据类型:=初始值;
3.数据类型:
-
:
- Integer 整数
- Real 实数,有小数点
- Bit 位,单引号括起
- Bit_vector 位矢量。双引号包括一组数
- Boolean 布尔类型,只有true和false
- Character 单引号括起的字符
- tring 包括双引号的字符串
-
:
-
: 标准逻辑位std-logic数据类型; 标准逻辑矢量std-logic-vector数据类型; std-logic定义了9个不同的值:
- ‘U’ 初始值
- ‘X’ 不定,未知
- ‘0’ 0
- ‘1’ 1
- ‘Z’ 高阻
- ‘W’ 弱信号不确定,未知
- ‘L’ 弱信号0
- ‘H’ 弱信号1
- ‘-’ 不可能的情况
第二节 结构部分
VHDL超高速集成电路硬件描述语言
1.库的说明语句:
库是用VHDL语言编写的源程序及其编译数据的集合由各种程序包组成。程序包提供各种数据类型、转换函数和操作符,供设计和使用。 语法格式:
Library 库名; Use 库名.程序包.项目名;
举例说明:
library ieee; use iee.std_logic_1164.all; //用到了ieee库以及ieee库中的std_logic_1164程序包中的所有资源。
2.实体语句语法说明:
In输入类型 out输出类型 inout输入输出类型 buffer缓冲类型可在结构内反馈 Linkage 在没有指定方向的情况下,没有指定的方向。 语法格式:
Entity 实体名 is Port(端口名称1:端口方式1 端口类型1; 端口名称1: 端口方式2 端口类型2); End 实体名;
3.结构体说明语句语法:
语法格式:
Architecture 结构体名称 of实体名 is 结构体说明部分; Begin 结构并行语句部分; end 结构体名称;
结构体名称:本结构体的命名。通常根据结构体的功能进行命名。 结构描述部分:定义结构内使用的信号、常数、数据类型和函数
第三节 表达式部分
表达式是通过连接多个操作数来完成算数或逻辑计算的不同操作符
1.逻辑操作符:
- NOT 取反
- AND 与
- OR 或
- NAND 与非
- NOR 或非
- XOR 异或 适用于逻辑操作符的变量是std-logic,bit,std-logic-vector这三种数据类型,逻辑操作时,逻辑操作符的左、右、代入信号的数据类型必须相同。在逻辑操作位矢量时,是按位操作,结果是位矢量。 当一个句子中有两个或两个以上的逻辑表达式时,左右优先级没有区别。
2.算数运算符:
- “ ” 加
- “-” 减
- “*” 乘
- “/” 除
- MOD 求模运算
- REM 取余运算
- “ ” 正
- “-” 负
- ** 指数运算
- ABS 取绝对值 正数操作的操作数可以是整数、实数和物理量 加减运算符的使用范围可以是整数和实数,加减运算的两个操作数必须相同类型 乘除法的操作数可以相同于整数和实数,物理量乘以或除以整数的结果仍然是物理量,物理量除以相同的物理量商为整数或实数。 求模和取余操作的操作数必须是同一整数类型的数据 将加、减、乘、除能编译成逻辑电路,其余的操作很难编译成逻辑电路,有时完全不可能。
3.关系运算符:
关系运算符的运算结果是布尔数据类型
- = 等于
- /= 不等于
- < 小于
- <= 小于等于
- “>” 大于
- => 大于等于 比较两个对象时,数据类型必须相同 =和/=适用于多数据类型对象之间的比较 大于、小于、大于等于、小于等于适用于整数、实数、位、位矢量及数组类型的比较 <=符号有两种含义:代入符和小于等于符号 比较两个位矢量类型的对象时,从左到右按位比较
4.并置运算符:
并置运算符并置运算符&可用于位连接,形成位矢量 并置运算符可用于两个位矢量链接,形成更大的位矢量
5.操作操作符优先级:
操作符的的情况下,操作符的运算优先顺序只有顺序和优先顺序,不同行的操作符的运算可能是同时的。
第四章 顺序语句
1.赋值句:
在VHDL中,只能在VHDL信号解释程序的并行部分(如结构体的解释部分),但可以在VHDL并行语句和顺序语句同时使用。信号赋值的书写格式如下:
目标信号<=表达式;
在VHDL综合功能、变量解释和赋值句只能在VHDL说明和使用程序的顺序部分,只能出现在过程、过程和函数中。变量赋值句的书写格式如下:
目标变量:=表达式;
不同之处在于信号赋值语句延迟。
2.If语句:
在VHDL中,if句子是一个具有条件控制功能的句子。他根据指定的条件和条件确定句子的执行顺序。 书写格式:
if 条件 1 then 第一组顺序句; elsif 条件2 then 第二组顺序语句; else 第n条顺序语句; end if;
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”; elsifinput(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;
3.case语句:
case语句是根据条件表达式的执行由符号“=>”所指的一组算徐语句。 语法格式:
case 条件表达式 is
when 条件表达式的值 =>一组顺序语句;
when others => 一组顺序语句;
end case;
If和case的不同:if语句是有序的,先处理最起使、最优先的条件,后处理次优先的条件。case语句是无序的,所有条件表达式的值都并行处理。case语句中的条件表达式的值必须列举穷尽,不可重复。不能穷尽的条件表达式用others表示。
4.for loop语句:
for loop循环语句使程序进行有规则的循环。 书写格式:
循环标号:for 循环变量 in 范围 loop
顺序处理语句;
end loop 循环标号;
循环标号:for loop循环的标识符 循环变量:整数变量,循环变量的只在每次循环中都发生变化,自动递增或递减。循环变量不需要另加说明,在循环体中可读不可写。 范围:离散范围,是循环变量在循环过程中依次取值的氛围实际上限制了循环的次数。
5.null语句:
在VHDL中,null语句用来表示一种占位置的空操作,他不进行任何操作,执行该语句只是使VHDL程序去执行下一个语句。经常用于case语句中,从而能满足case语句对条件选择值全部列举的要求。
第五章 并行语句
1.进程语句:
进程语句包含在结构体中,一个结构体可以有很多个进程语句,多个进程语句间是并行的,并可访问结构体或实体中定义的信号。进程中的语句是顺序执行的。进程间的通讯是由信号来传递的。 语法如下:
标记:process(敏感信号表)
变量说明语句;
Begin
一组顺序语句;
End process 标记;
- 进程语句的敏感信号表: 敏感信号是指那些之发生改变后能够引起进程语句执行的信号。敏感信号表部分可以省略,但此时进程语句中要有其他形式的敏感激励信号。 D触发器例子:
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;
- 进程语句的启动: 进程语句有两种工作状态:等待状态和执行状态。当敏感信号表中的信号都没有变化时,进程处于等待状态;当敏感信号表中的信号有变化时,进程处于执行状态。
- 进程语句的同步: 同一个结构体可以有多个进程存在,多个进程公用一个敏感信号实现同步。
2.并发信号赋值语句:
信号的赋值语句在进程内部出现时是顺序语句。信号赋值语句直接在结构体的进程之外出现时,它将作为一种并发语句的形式出现。 并发信号赋值语句靠时间来驱动,因此对于并发信号赋值语句来说,只有当赋值符号”<=”右边的对象有事件发生时才会执行该语句。 并发信号赋值语句常用于基本门电路、加法器、乘法器、除法器和比较器等基本逻辑电路进行描述。 一条并行信号赋值语句与含有信号赋值语句的进程是等价的,因此可以将一条并行吸信号赋值语句改写成等价的进程语句。
3.条件信号赋值语句:
条件信号的赋值语句是一种并行描述语句。 书写格式如下:
目标信号<=表达式1 when 条件1 else
表达式2 when 条件2 else
表达式n;
相比于if语句,if语句是顺序描述语句,因此只能在进程内部使用,而条件信号赋值语句是并行描述,他需要在结构体中的进程之外使用。 对于if来说else可有可无,信号赋值语句中的else语句是必须有的。 If语句可以嵌套使用;而条件信号赋值语句是赋值语句,不能嵌套使用,因此不能生成锁存器。
4.选择信号赋值语句:
根据选择条件的不同而将不同的表达式赋给目标信号的语句。是并行描述语句。 语法格式:
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来代表其他所有可能的值。因为式并行语句不可在进程内部使用。
5.元件例化语句:
在设计复杂的数字电路(或说明数字电路系统)时,可以调用已经设计好的实体,这样使VHDL程序设计变得简单了。 调用的原件或者模块的说明采用component语句,他的作用就是在结构体的说明部分说明调用的元件或者模块,是原件说明语句。 书写格式:
component 调用的元件名
generic 参数说明;//可有可无
port 端口说明;
end component;
为了把调用的原件正确嵌入到高一层的结构体描述中,就必须把被调用的原件端口信号与结构体中相应端口信号正确的连接起来。这就是原件例化语句实现的功能。 书写格式:
标号名:元件名
Generic map(参数映射)
Port map(端口映射);
标号是唯一的。 端口映射两种方法:位置映射,名称映射。 主要用于模块化的设计中,优点是可以使用以前建立的元件或者模块,从而避免大量重复VHDL程序的编写。
6.生成语句:
第六节 时钟信号描述语句
1.时钟边沿的描述:
众所周知,任何时序电路都以时钟信号为驱动,时序电路只是在时钟信号的边沿到来,其状态才发生改变。因此。时钟信号的通常是描述时序电路程序的执行条件。另外,时序电路也总是以时钟进程的形式来进行描述的。 当时钟信号作为进程的敏感信号时,在敏感信号的表中不能出现一个以上的时钟信号,除时钟信号以外,复位信号等是可以和时钟信号一起出现在敏感表中的
1、上升沿描述: 时钟的起始值为‘0’表示为clk’last_value=’0’;上升沿的到来表示发生了一个事件,用clk’event表示;上升沿以后,时钟信号当前的值为‘1’,故为clk=‘1’ 简写为: clk’event and clk=’1’
2、下降沿描述: 同理简写为: clk’event and clk=’0’
2.时序电路中进程敏感信号是时钟信号:
所谓同步复位,就是当复位信号有效且在给定的时钟边沿到来时,触发器才被复位; 异步复位则是,一旦复位信号有效,触发器就被复位。
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;