金庸武侠未解之谜:VHDL语法学习--初步认识VHDL

来源:百度文库 编辑:九乡新闻网 时间:2024/04/29 03:10:37
VHDL是用来描述数字电路的, 可以简单的描述一个门电路,还可以甚至复杂到描述微处理器或者一个系统,但是无论描述的电路多么复杂,它的完整结构都是由Entity,Architecture,Configuration,Package和Library 5个部分。但是一般情况,程序中只要有Entity和Architecture就可以描述电路了。看下图是一个简单的VHDL程序构造图:
造图:

举一个简单的例子:

ENTITY mux IS
GENERIC( m:TIME := 1ns);
PORT(
d0,d1,sel: IN BIT;
q:OUT BIT
);

ARCHITECTURE connect OF mux IS
SIGNAL tmp: BIT;
BEGIN
cale:PROCESS(d0,d1,sel)
VARIABLE tmp1,tmp2,tmp3:BIT;
BEGIN
tmp1:= d0 and sel;
tmp2:= d1 and (not sel);
tmp3:= tmp1 or tmp2;
tmp <= tmp3;
q<= tmp AFTER m;
END PROCESS;
END connect;

知识点:
1)关于
GENERIC
GENERIC必须放在端口说明之前,用于指定参数。上面的例子中的语句指定了Architecture内的m的值为1ns。举个例子:tmp1:=d0 and sel AFTER m; 表示d0和sel两个输入信号相and之后,经过1ns延迟才送到tmp1。

2)SIGNAL,VARIABLE,CONSTANT
在例子中出现了SIGNAL和VARIABLE两种,有什么区别呢?

SIGNAL是一种表示全局的量,用在ARCHITECTURE,PACKAGE,ENTITY中;SIGNAL赋值的时候要用<=,和给Port赋值的时候方法一样;

VARIABLE是表示局部量,用在PROCESS,FUNCTION,PROCEDURE;VARIABLE赋值的时候要用:=,这一点是很大的不同;

CONSTANT是全局量,在上面提到的所有场合中都可以用。CONSTANT也是用:=来赋值的;


3)关于VHDL的数据类型。
VHDL数据类型

VHDL是一种强数据类型语言。要求设计实体中的每一个常数、信号、变量、函数以及设定的各种参量都必须具有确定的数据类型,并且相同数据类型的量才能互相传递和作用。

VHDL数据类型分为四大类:

1标量类型(SCALAR TYPE);

2复合类型(COMPOSITE TYPE);

3存取类型(ACCESS TYPE);

4文件类型(FILES TYPE)

又分为:

1预定义数据类型、

2用户自定义数据类型

1、VHDL的预定义数据类型

1)布尔量(boolean)

布尔量具有两种状态:false 和 true 常用于逻辑函数,如相等(=)、比较(<)等中作逻辑比较。如,bit 值转化成boolean 值:
boolean_var := (bit_var = ‘1’);

2)位(bit)
bit 表示一位的信号值。
放在单引号中,如 ‘0’ 或 ‘1’。

3)位矢量 (bit_vector)
bit_vector 是用双引号括起来的一组位数据。
如: “001100”  X“00B10B”

4)字符(character)
用单引号将字符括起来。
variable character_var : character;
... ...
Character_var : = ‘A’;

5)整数(integer)
integer 表示所有正的和负的整数。硬件实现时,利用32位的位矢量来表示。可实现的整数范围为:
-(231-1) to (231-1)
VHDL综合器要求对具体的整数作出范围限定,否则无法综合成硬件电路。
如:signal s : integer range 0 to 15;
信号 s 的取值范围是0-15,可用4位二进制数表示,因此 s 将被综合成由四条信号线构成的信号。

6)自然数(natural)和正整数(positive)
natural是integer的子类型,表示非负整数。
positive是integer的子类型,表示正整数。

定义如下:
subtype natural is integer range 0 to

integer’high;

subtype positive is integer range 1 to

integer’high;

7)实数(REAL)或称浮点数
取值范围:-1.0E38 - +1.0E38
实数类型仅能用于VHDL仿真器,一般综合器不支持。

8)字符串(string)
string 是 character 类型的一个非限定数组。用双引号将一串字符括起来。如:
variable string_var : string(1 to 7);
……
string_var := “Rosebud”;

9)时间(TIME)
由整数和物理单位组成
如:55 ms,20 ns

10)错误等级(SEVERITY_LEVEL)
仿真中用来指示系统的工作状态,共有四种:
NOTE(注意)、WARNING(警告)、ERROR(出错)、FAILURE(失败)

2、IEEE预定义标准逻辑位与矢量

1)std_logic 类型
由 ieee 库中的std_logic_1164 程序包定义,为九值逻辑系统,如下:
(‘U’,‘X’,‘0’,‘1’,‘Z’,‘W’,‘L’,‘H’,‘-’)
‘U’:未初始化的,
‘X’:强未知的,
‘0’:强0,
‘1’:强1,
‘Z’:高阻态,   
‘W’:弱未知的,
‘L’:弱0,       
‘H’:弱1,
‘-’:忽略

由 std_logic 类型代替 bit 类型可以完成电子系统的精确模拟,并可实现常见的三态总线电路。

2)std_logic_vector 类型

由 std_logic 构成的数组。定义如下:

type std_logic_vector is array(natural range<>) of std_logic;
赋值的原则:相同位宽,相同数据类型。

3、用户自定义类型

用户自定义类型是VHDL语言的一大特色。
可由用户定义的数据类型有:

1)枚举类型、

2)整数和实数类型、

3)数组类型、

4)记录类型、

5)子类型

用类型定义语句TYPE和子类型定义语句SUBTYPE实现用户自定义数据类型。

TYPE语句格式:
例:type byte is array(7 downto 0) of bit;
variable addend : byte;
type week is (sun, mon, tue, wed, thu,fri, sat);

type 数据类型名 is 数据类型定义 [of 基本数据类型];

SUBTYPE语句格式:
例: subtype digits is integer range 0 to 9;

由subtype 语句定义的数据类型称为子类型。
subtype 子类型名 is 基本数据类型   约束范围;

1)枚举类型

枚举该类型的所有可能的值。格式:

如:type std_logic is(‘U’,‘X’,‘0’,‘1’,

‘Z’,‘W’,‘L’,‘H’,‘-’)

如:type color is(blue,green,yellow, red);

type my_logic is (‘0’, ‘1’, ‘U’, ‘Z’);

variable hue : color;

signal sig : my_logic;

hue := blue;       sig <= ‘Z’;

type 类型名称 is (枚举文字{,枚举文字});

枚举类型的编码: 综合器自动实现枚举类型元素的编码,一般将第一个枚举量(最左边)编码为0,以后的依次加1。编码用位矢量表示 ,位矢量的长度将取所需表达的所有枚举元素的最小值。

如:type color is(blue,green,yellow,red);

编码为: blue=“00”;             
green=“01”;
yellow=“10”;      
red=“11”;

2)整数类型

用户定义的整数类型是标准包中整数类型的子范围。格式:例:type my_integer is integer range 0 to 9;

3)数组类型

数组:同类型元素的集合。VHDL支持多维数组。

多维数组的声明:

type byte is array(7 downto 0) of bit;
type vector is array(3 downto 0) of byte;

限定数组、非限定数组、属性:type 类型名称 is range 整数范围;

限定数组:

其索引范围有一定的限制。

格式:   

非限定数组:数组索引范围被定义成一个类型范围。

格式:

例:type bit_vector is array(integer range <>)

of bit;

variable my_vector:bit_vector (5 downto -5);

type 数组名 is array(数组范围) of 数据类型;

type 数组名 is array(类型名称 range <>) of 数据类型;

属性:

VHDL为多种类型定义了属性。

语法如下:

对象’属性

VHDL为数组预先定义的属性:

left      right

high      low

length    range

reverse_range

对应变量:

variable my_vector : bit_vector (5 downto -5);

各属性如下:

my_vector’left                             5

my_vector’right                         -5

my_vector’high                           5

my_vector’low                          -5

my_vector’length                       11

my_vector’range                  (5 downto -5)

my_vector’reverse_range        (-5 to 5)

4)记录类型

记录是不同类型的名称域的集合。

格式如下: 

访问记录体元素的方式:记录体名.元素名

type 记录类型名 is record

元素名:数据类型名;

元素名:数据类型名;

┇ 

end   record;

例:

constant len:integer:= 8 ;

subtype byte_vec is bit_vector(len-1 downto 0);

type byte_and_ix is record

byte : byte_vec;

ix : integer range 0 to len;

end record ;

signal x, y, z : byte_and_ix ;

signal data : byte_vec ;

signal num : integer ;

…….

x.byte <= “11110000” ;

x.ix <= 2 ;

data <= y.byte ;

num <= y.ix ;

z <= x ;

5)子类型

子类型是已定义的类型或子类型的一个子集。

格式:            

例:

bit_vector 类型定义如下:

type bit_vector is array (natural range <>)

of bit;

如设计中只用16bit;可定义子类型如下:

subtype my_vector is bit_vector(0 to 15);

注:子类型与基(父)类型具有相同的操作符和子程序。可以直接进行赋值操作。

subtype 子类型名 is 数据类型名[范围];

4、数据类型转换

VHDL是一种强类型语言,不同类型的数据对象必须经过类型转换,才能相互操作。

1)类型转换函数方式

通过调用类型转换函数,使相互操作的数据对象的类型一致,从而完成相互操作。

library ieee;

library dataio;

use ieee.std_logic_1164.all;

use dataio.std_logic_ops.all;

entity cnt4 is

port(clk: in std_logic;

p: inout std_logic_vector(3 downto 0);

end cnt4;

architecture behv of cnt4 is

begin

process(clk)

begin

if clk’event and clk=‘1’ then

p<=to_vector(2, to_integer(p)+1);

end if;

end process;

end behv;

2)直接类型转换方式

对相互间非常关联的数据类型(如整型、浮点型),可进行直接类型转换。格式:

数据类型标识符(表达式)

如:variable a, b : real;

variable c, d : integer;

……

a:= real(c);

d:= integer(b);

4)VHDL的数据类型转换
数据类型的转换
在VHDL程序中,不同类型的对象不能代入,因此要进行类型转换.类型转换的方法有:
(1)类型标记法.用类型名称来实现关系密切的标量类型之间的
转换.
例如: VARIABLE x:INTEGER;
VARIABLE y:REAL;
使用类型标记(即类型名)实现类型转换时,可采用赋值语句:
x :=INTEGER(y); y :=REAL(x).
(2)类型函数法.
VHDL程序包中提供了多种转换函数,使得某些类型的数据之间可以相互转换,以实现正确的赋值操作.常用的类型转换函数有:
★CONV_INTEGER ( ):将STD_LOGIC_VECTOR类型转换成
INTEGER类型.
★CONV_STD_LOGIC_VECTOR( ):将INTEGER类型,UNSIGNED
类型或 SIGNED类型转换成STD_LOGIC_VECTOR类型.
★TO_BIT ( ): 将STD_LOGIC类型转换成BIT类型.
★TO_BIT_VECTOR( ):将STD_LOGIC_VECTOR类型转换
BIT_VECTOR 类型.
★TO_STD_LOGIC( ): 将BIT类型转换成STD_LOGIC类型.
★TO_STD_LOGIC_VECTOR( ): 将BIT_VECTOR类型转换成
STD_LOGIC_VECTOR类型.
注意 :引用时必须首先 打开库和相应的程序包.
该函数由STD_LOGIC_UNSIGNED
程序包定义
该函数由STD_LOGIC_ARITH
程序包定义
以下函数由STD_LOGIC_1164

-0-----------------------------------------------

类型转换
类 型 变 换 函 数
由STD_LOGIC_VECTOR转换成INTEGER
STD_LOGIC_UNSIGNED包含集
CONV_INTEGER(A)
由INTEGER,UNSDGNED,SIGNED转换成STD_LOGIC_VECTOR
由UNSIGNED,SIGNED转换成INTEGER
STD_LOGIC_ARITH包集合
CONV_STD_LOGIC_VECTOR(A,位长)
CONV_INTEGER(A)
由BIT_VECTOR转换为STD_LOGIC_VECTOR
由STD_LOGIC_VECTO转换为BIT_VECTOR
由BIT转换成STD_LOGIC
由STD_LOGIC转换成BIT
STD_LOGIC_1164包集合
TO_STDLOGICVECTOR(A)
TO_BITVECTOR(A)
TO_STDLOGIC(A)
TO_BIT(A)
功 能
函 数 名
由"STD_LOGIC_VECTOR"变换成"INTEGER"的实例
LIBRARY IEEE;
USE IEEE STD_LOGIC_1164.ALL;
USE IEEE STD_LOGIC_UNSIGNED.ALL;
ENTITY add5 IS
PORT (num:IN STD_LOGIC_VECTOR (2 DOWNTO 0);

);
END add5;
ARCHITECTURE rtl OF add5 IS
SIGNAL in_num:INTEGER RANGE 0 TO 5;

BEGIN
in_num<=CONV_INTEGER (num); 位矢量转换成整数变换式

END rtl;
^0^

------------------------

函     数     名                                     功           能

STD_LOGIC_1164包集合         

TO_STDLOGICVECTOR(A) 由BIT_VECTOR转换为STD_LOGIC_VECTOR

TO_BITVECTOR(A)           由STD_LOGIC_VECTO转换为BIT_VECTOR

TO_STDLOGIC(A)             由BIT转换成STD_LOGIC

TO_BIT(A)                       由STD_LOGIC转换成BIT

STD_LOGIC_ARITH包集合

CONV_STD_LOGIC_VECTOR(A, 由INTEGER,UNSDGNED,SIGNED转换

位长)                                       STD_LOGIC_VECTOR

CONV_INTEGER(A)                  由UNSIGNED,SIGNED转换成INTEGER

STD_LOGIC_UNSIGNED包含集

CONV_INTEGER(A)                  由STD_LOGIC_VECTOR转换成INTEGER





LIBRARY IEEE;
USE IEEE STD_LOGIC_1164.ALL;
USE IEEE STD_LOGIC_UNSIGNED.ALL;

ENTITY add5 IS

PORT(
num:IN STD_LOGIC_VECTOR (2 DOWNTO 0);



);

END add5;

ARCHITECTURE rtl OF add5 IS

SIGNAL in_num:INTEGER RANGE 0 TO 5;



BEGIN

in_num<=CONV_INTEGER (num); --位矢量转换成整数变换式



END rtl;