您的当前位置:首页VHDL基础1

VHDL基础1

2021-04-07 来源:世旅网
VHDL基础1

Description Structure

⼀个可综合的VHDL描述中⼀般由3部分组成:LIBRARY declarations、ENTITY、ARCHITECTURELibrary(库)⽤来设计重⽤和代码共享,使代码结构更清晰

1 LIBRARY library_name;

2 USE library_name.package_name.package_parts;

常⽤的三个Libray:ieee、std、work

其中std、work是默认可见的,不需声明,ieee需要明确的声明Entity(实体)描述电路的输⼊/输出引脚

ENTITY entity_name IS

GENERIC(参数名:数据类型:=设定值 ...);

PORT (port_name1: port_mode data_type; port_name2: port_mode data_type; ...);END entity_name;

GENERIC类属性为可选,⽤来指定诸如数据总线宽度、延时时间等参数singal_mode 可以是 4 种类型:in out inout buffer

OUT 模式⽆法回读到电路内部,Buffer 模式可以,但是 buffer 不能连接到其他类型的端⼝,即不能把该模块作为⼦模块例化,⼀般使⽤中间缓冲信号,解决回读问题。

Architecture(结构体)描述电路的⾏为和实现的功能

Architecture 包含两个部分:声明部分和代码部分

声明部分(可选)⽤来声明数据类型、常量、信号、⼦程序、元件等代码部分 (begin...end)描述电路⾏为

1 ARCHITECTURE 结构体名 OF 实体名 IS2 说明语句3 BEGIN

4 功能描述语句5 ......6 END 结构体名;

注释⽤ -- 开始

VHDL不区分⼤⼩写

Data Types

三种数据对象,声明信号 signal

1 signal name : type [range] [:= initial_vaule];

还有 常量 constant 声明:

1 constant name : type := value;

还有 变量 variable 声明

1 variable name : type [range] [:= initial_vaule];

Pre-defined Data Types

bit & bit_vector

⽤'0'、'1'赋值

1 signal x : bit;

2 signal y : bit_vector (3 DOWNTO 0);3

4 x<='1';5 y<=\"0011\"

std_logic & std_logic_vector

不同于bit类型,可取9种逻辑数据类型,但只有0、1、X、Z 可综合std_logic 是 std_ulogic的⼦集

Boolean

两种取值:true、false

TIME

1 CONSTANT t_delay:TIME:=30 ns

数值部分和单位之间有个空格

fs、ps、ns、us、ms、sec、min、hr 103关系

integer

32位表⽰的整数 范围-(231-1)~(231-1)

其他进制整数先写进制数,再⽤#括起来16#1F#real

⼩数表⽰、科学计数表⽰character & string

使⽤字符串的可以是常量 和 变量

User-defined Data Types

1 --integer range

2 TYPE student IS RANGE 0 TO 100;3

4 --enumerated(枚举)

5 TYPE state IS (state0,state1,state2,state3);6

7 --Array

8 TYPE matrix IS ARRAY (0 TO 3) OF std_loogic_vector;

Port Array

有时在定义端⼝时,需要把端⼝定义为⽮量阵列。但是在 Entity 中不允许使⽤ type 定义,所以我们必须⾃⼰定义包集 (package),然后使⽤ use 声明使⽤该⽤户⾃定义的包集,最后才能在 Entity 中使⽤这种新定义的类型。

Data Conversion

在 VHDL 中,不同类型的数据是不能直接进⾏算术/逻辑运算的,所以必要时必须进⾏类型转换操作。

函数名称 TO_STDLOGICVECTOR()

TO_BITVECTOR()TO_STDLOGIC()

TO_BIT

CONV_STD_LOGIC_VECTOR(a,位长)

CONV_INTEGER()

函数功能

与上相反

由BIT型转为STD_LOGIC型

与上相反

由整型转为STD_LOGIC_VECTOR型

与上相反

由BIT_VECTOR转为STD_LOGIC_VECTOR型 Operators

VHDL 语法虽然枯燥⽆味,但是只有对数据类型、运算操作符及其属性有了深刻认识,才能写出⾼质量和⾼效率的代码。

Opreators

VHDL提供了6种预定义的预算符:

赋值 assignment逻辑 logical算术 arithmetic关系 relational并置 concatenation

assignment⼀共三种:

<= ⽤于给 signal 对象赋值

:= ⽤于给 variable, constant, 赋值

=> ⽤于给⽮量(vector)对象的某些位赋值,常和 others ⼀起使⽤logical

进⾏逻辑运算,操作数必须是 bit, std_logic, std_ulogic 类型或者他们的扩展,即 bit_vector, std_logic_vector, std_ulogic_vector 类型

NOT, AND, OR, NAND, NOR, XORarithmetic

操作数是 signed, integer, real,其中 real 类型是不可综合的+ - * / ** MOD REM ABScomparison

⼀共有6种:= /= > < >= <=

concatenation⽤于位的拼接。

操作数:任何⽀持逻辑运算的数据类型操作符:& (, , ,)

Concurrent Code

HDL对应的是硬件电路,⽽硬件电路时刻⼯作,所以它的代码是并发执⾏的。只有process、function、procedure中的代码是顺序执⾏的,⽽这些模块作为共同整体时,它们之间也是并⾏的。在并发代码中可以使⽤下列各项:

运算操作符

when 语句(when/else 和 with/select/when)generate 语句block 语句when

when/else syntax:

1 assignment WHEN condition ELSE2 assignment WHEN condition ELSE3 ...;

with/select/when syntax:

1 WITH 选择信号表达式 SELECT2 assignment WHEN value,3 assignment WHEN value,4 ...;

generate

常和 for/if ⼀起使⽤,因为描述对象是电路,电路是固定的,功能也是静态的,所以⼀种⽤途是⽣成相同元件的多次实例化,第⼆种⽤途是⽣成结构相同的多次赋值、组合逻辑。两种⽤途⽬的都是减少代码量,增加可读性和可维护性block

为了把较长的代码分成⼏个较⼩的区域,便于阅读和维护,在每个块内都能对局部信号、数据类型和常量定义

1 块标号:BLOCK[(块保护表达式)]2 [说明部分]3 BEGIN

4 并⾏语句

5 END BLOCK [块标号];

Sequential Code

VHDL 本质是并发执⾏的代码,但是在 process, function, procedure 内部的代码是顺序执⾏的,当它们作为⼀个整体时,相互之间也是并发执⾏的。

顺序代码并⾮只能与时序逻辑 (sequential logic) 对应,同样也可以⽤它们来实现组合逻辑 (combinational logic)。这⾥主要讨论顺序代码,也就是这 3 个块中的代码,包括 if, wait, case, loop 语句。

process

在⼀个结构体中允许放置多个进程语句,这些进程也都是并⾏的,每个进程内部由⼀系列顺序语句构成

1 [进程标号:] PROCESS [敏感信号参数表] IS2 [进程说明部分]3 BEGIN

4 顺序描述语句

5 END PROCESS [进程标号];

每当敏感信号参数表⾥的任何参数变化时,进程都被激活重新执⾏⼀遍

进程说明部分主要定义⼀些局部量如常量, 变量,⼦程序等,但这⾥不能定义信号顺序描述语句是最重要的部分,常⽤顺序语句 if/case/loop

if

1 IF conditions THEN assignment;

2 ELSIF conditions THEN assignments;3 ......

4 ELSE assignments;5 END IF;

case

case 和 when 的区别在于,case 允许在每个测试条件下执⾏多个赋值操作,⽽ when 只能执⾏⼀个赋值操作。

1 CASE 表达式 IS

2 WHEN value => assignment;3 WHEN value => assignment;4 ...

5 WHEN OTHERS => assignments;6 END CASE;

loop

常⽤格式有两种loop

1 [loop标号:] LOOP

2 顺序语句;

3 END LOOP[loop 标号];

for/loop

1 [LOOP标号:] FOR 循环变量 IN 循环参数范围 LOOP2 顺序语句;

3 END LOOP[LOOP 标号];

循环变量是⼀个临时局部变量,由LOOP语句⾃动定义

LOOP不能⾃⼰跳出循环,也不能⾃⼰跳到另⼀个循环,有时候需要加⼊其它控制语句

1 [标识:] EXIT [LOOP 标识] [WHEN condition];2

3 [标识:] NEXT [另⼀个LOOP 标识] [WHEN condition];

/*****注释*****/

*⼀组在逻辑上互相独⽴的程序或程序段在执⾏过程中,其执⾏时间在客观上互相重叠

因篇幅问题不能全部显示,请点此查看更多更全内容