1、VHDL 语言的基本知识点罗列1 VHDL 语言的标识符VHDL 中的标识符可以是常数、变量、信号、端口、子程序或参数的名字。使用标识符要遵守如下法则:a) 标识符由字母(AZ ; az) 、数字和下划线字符组成。任何标识符必须以英文字母开头。末字符不能为下划线。 b) 不允许出现两个连续下划线。标识符中不区分大小写字母。VHDL 定义的保留子或称关键字,不能用作标识符。c) VHDL 中的注释由两个连续的短线(-)开始,直到行尾。以下是非法标识符:-Decoder 起始不能为非英文字母3DOP 起始不能为数字Large#number “#”不能成为标识符的构成符号Data_bus 不能有双下
2、划线Copper_ 最后字符不能为下划线On 关键字不能用作标识符。 注:在 AHDL 语言中标识符要区分大小写,但在 VHDL 语言中不区分大小写。所以写程序时,一定要养成良好的书写习惯,应用关键字时用大写,自己定义的标识符用小写。标识符表示的几种数据对象的详细说明如下:1) 常数( Constant )常数是一个固定的值,主要是为了使设计实体中的常数更容易阅读和修改。常数一被赋值就不能在改变。一般格式:CONSTANT 常数名:数据类型:= 表达式;例:CONSTANT Vcc: REAL: =5.0;设计实体的电源电压指定 常数所赋得值应与定义的数据类型一致。常量的使用范围取决于它被定义
3、的位置。程序包中定义的常量具有最大的全局化特性,可以用在调用此程序包的所有设计实体中;设计实体中某一结构体中定义的常量只能用于此结构体;结构体中某一单元定义的常量,如一个进程中,这个常量只能用在这一进程中。2) 变量( Variable)变量是一个局部变量,它只能在进程语句、函数语句和进程语句结构中使用。用作局部数据存储。在仿真过程中。它不像信号那样,到了规定的仿真时间才进行赋值,变量的赋值是立即生效的。变量常用在实现某种算法的赋值语句中。一般格式:VARIABLE 变量名 数据类型 约束条件:=表达式;例:VARIABLE x,y:INTEGER; 定义 x,y 为整数变量VARIABLE
4、count: INTEGER RANGE0 TO255:=10; 定义计数变量范围变量的适用范围仅限于定义了变量的进程或子程序中。若将变量用于进程之外,必须该值赋给一个相同的类型的信号,即进程之间传递数据靠的信号。变量赋值语句的语法格式如下:目标变量:=表达式;变量赋值符号是“:=”。赋值语句右方的表达式必须是一个与目标变量有相同数据类型的数值。变量不能用于硬件连线和存储元件。3) 信号( Signal)信号是描述硬件系统的基本数据对象,它类似于连接线,它除了没有数据流动方向说明以外,其它性质与实体的端口(Port)概念一致。变量的值可以传递给信号,而信号的值不能传递给变量。信号通常在构造体、
5、包集合和实体中说明。信号说明格式为:SIGNAL 信号名: 数据类型;信号初始值的设置不是必需的,而且初始值仅在 VHDL 的行为仿真中有效。1 变量变量只能在进程、函数和过程中使用,一旦赋值立即生效。例:VARIABLE x, y: INTEGER;VARIABLE count: INTEGER RANGE 0 TO 255:=10;2 信号信号除了没有方向的概念以外几乎和端口概念一致。例:SIGNAL sys_clk: BIT:=0;SIGNAL ground: BIT:=0在程序中,信号值输入信号时采用代入符”(大于)=(大于等于) 3) 算术运算符+(加)/(除)SLL(逻辑左移)RO
6、R(逻辑循环右移)-(减)MOD(求模)SRL(逻辑右移)ABS(取绝对值)*(乘)REM(取余)SLA(算术左移)4) 其他运算符(并联运算符,在元件例化时可用于形参倒实参的映射)4 VHDL 语言的结构VHDL 语言主要组成构件有设计实体(Entity) 、结构体(Architecture) 、子程序( Function Procedure ) 、集合包(Package)和库(Library) ,前四种称为可编译的设计单元。一个 VHDL 设计就是有这四种构件的组成,编译之后将它们放在制定的库中共享。其中,实体用于描述设计的接口界面信号,它规定端口数目,端口方向和端口类型。它与硬件电路设计
7、中的符号相对应。而结构体指定设计的真实行为,性能和结构,与硬件电路设计中的原理图相对应。子程序是可被调用的执行某一特定功能算法的集合。集合包则是为了使常用的数据类型、常数和子程序对于其他设计块可用而集中充放的一批设计单元和约定。4.1 设计实体实体的定义语法为:ENTITY 实体名 IS端口说明;END 实体名;端口说明书写格式如下:PORT(端口名,端口名:方向 数据类型名;端口名,端口名:方向 数据类型名) ;例如,一个二选一路数据选择器的设计实体可描述如下:ENTITY selection ISPORT(a, b, sel: IN BIT;C : OUT BIT );END select
8、ion;4.2 构造体用于描述系统内部的结构和行为。构造体部分定义了设计单元的具体功能(行为) 。1. 构造体句法如下:ARCHITECTURE 构造体名 OF 实体名 IS定义语句内部信号,常数,数据类型,函数等的定义;BEGIN并行处理语句;END 构造体名;例如:ARCHITECTURE dataflow OF selection ISBEGINqRETURNIS定义语句;BEGIN;END 函数名称;.下面是一个比较器的例子:FUNCTION max(a, b: INTEGER) RETURN INTEGER ISBEGINIF (a=b)THEN RETURN a;ELSE RETU
9、RN b;END IF;END max;一个函数定义好后,可以在其它地方调用。过程过程的定义形式如下:PROCEDURE ISBEGIN;END 过程名称;.下面是一个比较器的例子:FUNCTION max(a, b, c: INTEGER) ISBEGINIF (a=b)THEN c顺序处理语句;END CASE;条件句中的“=”不是操作符,只相当于“THEN”作用。6 VHDL 中的一些重要信号6.1. 时钟信号和复位信号1)时钟信号的描述* 若进程的敏感信号是时钟信号,这时时钟信号出现在 PROCESS 后的括号中.例: process (clock_signal)beginif (cl
10、ock_edge_condition) then signal_out=signal_in:其它语句:end if;end process;* 在进程中用 WAIT ON 语句等待时钟这样的电路没有敏感信号,进程通常停留在 WAIT ON 语句上,只有时钟信号到来且满足一定条件时,其余语句才能执行.例:processbeginwait on (clock_signal) until (clock_edge_condition)signal_out=signal_in;其它语句end process;* 敏感表中只能有一个时钟信号* wait on 语句只能放在进程的最前面或者最后面* 时钟的边
11、沿描述描述时钟一定要指明是上升沿还是下降沿上升沿到来的条件:IF clk=1 AND clkLAST_VALUE=0 AND clkEVENT下降沿到来的条件:IF clk=0 AND clkLAST_VALUE=1 AND clkEVENT关于时钟信号的总结:IF clock_signal=current_value ANDclock_signalLAST ANDclock_siganlEVENT可以简单写为:IF clock_signal=clock_siganlEVENT AND current_value6.2. 复位信号*同步复位 当复位信号有效且在给定的时钟边沿到来时,触发器才被复
12、位.例 1:process (clock)beginif (clock_edge_condition) thenif (reset_condition) thensignal_out=reset_value;elsesignal_out=signal_in;:其它语句:end if;end if;end process;例 2:process(clock)if (clockevent and clock=1) thenif reset=1 thencount=0;elsecount=count+1;end if;end if;end process;此例中,敏感表中只有时钟信号,因为只有时钟到
13、来时才能复位.* 异步复位只要复位信号有效,触发器就被复位,所以敏感表中除时钟信号外,还需要复位信号例 1:process(reset_signal,clock_signal)beginif (reset_signal) thensignal_out=reset_value;elsif (clock_event and clock_edge_condition) thensignal_out=signal_in;:其它语句:end if;end process;例 2:process(clock,reset)beginif reset=1 thencount=0;elsif clockevent and clock=1 thencount=count+1;end if;end process;