VHDL语法基础掌握

第一节 数据部分

1.基本标识符:

AZ,az,0~9,以及下划线:“_”。VHDL不区分大小写。标识符必须以字母开头,不能以下划线为结尾,不能出现连续的两个或多个下划线。

2.数据对象:

  1. 常量赋予值后不改变,格式:

    Constant 常量名:数据类型:=表达式;
    
  2. 变量是可以改变值的量,可以在进程和子程序中说明,可以是任意数据类型。变量的赋值是立即生效的,格式:

    Variable 变量名:数据类型:=初始值或表达式;
    
  3. 信号是电子电路内部硬件连接的抽象,可以将结构体中分离的并行语句连接起来, 并且能通过端口与其他的模块连接。可以随着时间改变值,不想变量复制立即生效,允许产生时延。信号通常在实体、结构体和程序包中说明,但不能在进程中说明,只能在进程中使用。使用“<=”赋值,允许产生时延,使用“: =”不会有时延,格式:

    Signal 信号名:数据类型:=初始值;
    

3.数据类型:

  1. 标准数据类型

    • Integer 整数
    • Real 实数,有小数点
    • Bit 位,单引号括起
    • Bit_vector 位矢量。双引号括起来的一组数
    • Boolean 布尔类型,只有true和false
    • Character 字符,单引号括起
    • tring 字符串,双引号括起
  2. 自定义数据类型

  3. IEEE标准数据类型std-logic和std-logic-vector
    标准逻辑位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;

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;

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 标记;
  1. 进程语句的敏感信号表:
    敏感信号是指那些之发生改变后能够引起进程语句执行的信号。敏感信号表部分可以省略,但此时进程语句中要有其他形式的敏感激励信号。
    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. 进程语句的同步:
    同一个结构体可以有多个进程存在,多个进程公用一个敏感信号实现同步。

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;

你可能感兴趣的:(开发语言)