窦衡VHDL视频相关.docx

上传人:b****7 文档编号:9117197 上传时间:2023-02-03 格式:DOCX 页数:139 大小:2.39MB
下载 相关 举报
窦衡VHDL视频相关.docx_第1页
第1页 / 共139页
窦衡VHDL视频相关.docx_第2页
第2页 / 共139页
窦衡VHDL视频相关.docx_第3页
第3页 / 共139页
窦衡VHDL视频相关.docx_第4页
第4页 / 共139页
窦衡VHDL视频相关.docx_第5页
第5页 / 共139页
点击查看更多>>
下载资源
资源描述

窦衡VHDL视频相关.docx

《窦衡VHDL视频相关.docx》由会员分享,可在线阅读,更多相关《窦衡VHDL视频相关.docx(139页珍藏版)》请在冰豆网上搜索。

窦衡VHDL视频相关.docx

窦衡VHDL视频相关

VHDL语言

1、VHDL设计简述

VHDL主要用于描述数字系统的结构、行为、功能和接口。

VHDL将一个设计(元件、电路、系统)分为:

●外部(可视部分、端口)

●内部(不可视部分、内部功能、算法)

例:

2选1选择器的VHDL语言描述:

Libraryieee;

Useieee.std_logic_1164.all;

Entitymux21is

Port(a,b:

instd_logic;

S:

outstd_logic;

Y:

outstd_logic);

Endmux21;

Architecturemux_archofmun21is

Begin

Y<=awhens=’0’else

Bwhens=’1’;

Endmux_arch;

VHDL语言的一基本些特点:

●VHDL语言由保留关键字组成;

●一般,VHDL语言对字母的大小写不敏感;但是在单引号、双引号所括的字符、字符串要例外。

●每条VHDL语句由一个分号(;)结束;

●VHDL语言对空格不敏感,可留出一些空格来增加程序的可读性;

●在“--”之后是的VHDL的注释语句;

●VHDL有以下描述风格:

1.行为描述;

2.数据流(寄存器传输RTL)描述;

3.结构化描述;

2、VHDL程序基本结构

基本结构包括:

实体(entity)

结构体(architecture)

配置(configuration)

库(library)、程序包(package)

库、程序包

实体(entity)

结构体

(architecture)

进程

或其它并行结构

 

配置(configuration)

3、实体(说明)

实体(说明):

定义系统的输入输出端口

语法:

Entityis

Genericdeclarations

Portdeclarations

End;(1076-1987version)

Endentity;(1076-1993version)

(1)类属说明

确定实体或组件中定义的局部常数。

模块化设计时多用于不同层次模块之间信息的传递。

可从外部改变内部电路结构和规模。

必须放在端口说明之前。

Generic(

常数名称:

类型[:

=缺省值]

{常数名称:

类型[:

=缺省值]}

);

其中,{}表示为可选项。

类属常用于定义:

实体端口的大小、

设计实体的物理特性、

总线宽度、

元件例化的数量等。

例:

Entitymckis

Generic(width:

integer:

=16);

Port(add_bus:

outstd_logic_vector

(width-1downto0));

Entitymck;

例:

2输入与门是实体描述

Entityand2is

Generic(risewidth:

time:

=1ns

Fallwidth:

time:

=1ns);

Port(a1:

instd_logic;

a0:

instd_logic;

z0:

outstd_logic);

endentityand2;

注意:

数据类型time用于仿真模块的设计。

综合器仅支持数据类型为整数的类属值。

(2)端口声明

端口声明:

确定输入输出端口的数目和类型。

port(

端口名称{,端口名称}:

端口模式数据类型;

端口名称{,端口名称}:

端口模式数据类型);

其中,端口模式:

in输入型,此端口为只读型。

out输出型,此端口只能对其赋值。

inout输入输出型,既可读也可赋值。

Buffer缓冲型,与out相似,但可读。

数据类型:

指端口上流动的数据的表达格式。

为预先定义好的数据类型。

如:

bit、bit_vector、integer、std_logic、std_logic_vector等

例:

Entitynand2is

Port(

A,b:

inbit;

Z:

outbit);

Endnand2;

(2)结构体

作用:

定义系统(或模块)的行为、元件几内部的连接关系,即描述其逻辑功能。

两个组成部分:

●对数据类型、常数、信号、子程序、元件等元素的说明部分。

●以各种不同的描述风格描述的系统的逻辑功能部分。

常用的描述风格有:

行为描述、数据流。

实体与结构体的关系:

一个设计实体可有多个结构体,代表实体的多种实现方式。

各个结构体的地位相同(并行关系)。

但一个结构体只能对应一个实体。

结构体的语法:

Architecture结构体名称of实体名称is

[说明语句]内部信号、常数、数据类型、子程序(函数、过程)、元件等的说明;

Begin

[并行处理(功能描述)语句;]

End[architecture]结构体名称;

注意:

同一实体的结构体不能同名。

定义语句中的常数、信号不能与实体中的端口同名。

例:

结构体中错误的信号声明

Entityxis

Port(sig,const:

inbit;

Out1,out2:

outbit);

Endx;

Architectureaofxis

Signalsig:

bit;

Constantconst:

bit:

=’1’;

Begin

Enda;

其中,sig与const有重名。

例:

一个完整描述(3bit计数器)

Entitycounter3is

Port(clk,reset:

inbit;

Count:

outintegerrange0to7);

Endcounter3;

Architectureaofcounter3is

Signalcount_tmp:

integerrange0to7;

Begin

Process

Begin

Waituntil(clk’eventandclk=’1’);

Ifreset=’1’orcount_tmp=7then

Count_tmp<=0;

Else

Count_tmp<=count_tmp+1;

Endif;

Endprocess;

Count<=count_tmp;

Enda;

3bit计数器的等效描述(out与buffer的区别)

Entitycounter3is

Port(clk,reset:

inbit;

Count:

bufferintegerrange0to7);

Endcounter3;

Architectureaofcounter3is

--Signalcount_tmp:

integerrange0to7;

Begin

Process

Begin

Waituntil(clk’eventandclk=’1’);

Ifreset=’1’orcount=7then

Count<=0;

Else

Count<=count+1;

Endif;

Endprocess;

Enda;

3、配置

配置:

从某个实体的多种结构体描述方式中选择特定的一个的过程。

简单配置的语法:

Configuration配置名of实体名is

For选配结构体名

Endfor;

End配置名;

注意:

选配结构体名后面没有分号。

例:

一个与非门不同实现方式的配置如下:

Libraryieee;

Useieee.std_logic_1164.all;

Entitynandis

Port(a,b:

instd_logic;

c:

outstd_logic);

Endentitynand;

Architecturea1ofnandis

Begin

c<=not(aandb)

Endarchitecturea1;

Architecturea2ofnandis

Begin

c<=’1’when(a=’0’)and(b=’0’)else

’1’when(a=’0’)and(b=’1’)else

’1’when(a=’1’)and(b=’0’)else

’0’when(a=’1’)and(b=’1’)else

‘0’;

Endarchitecturea2;

Configurationfirstofnandis

Fora1;

Endfor;

Endfirst;

Configurationsecondofnandis

Fora2;

Endfor;

Endsecond;

例:

一个对计数器实现多种形式的配置如下:

Entitycounteris

Port(clr,clk:

inbit;

Data_out:

outinteger);

endentitycounter;

architecturecount_255ofcounteris

begin

process(clk)

variablecount:

integer:

=0;

begin

ifclr=’1’then

count:

=0;

elsifclk’eventandclk=’1’then

ifcount=255then

count:

=0;

else

count:

=count+1;

endif;

endif;

data_out<=count;

endprocess;

endcount_255;

architecturecount_46kofcounteris

begin

process(clk)

variablecount:

integer:

=0;

begin

ifclr=’1’then

count:

=0;

elsifclk’eventandclk=’1’then

ifcount=65535then

count:

=0;

else

count:

=count+1;

endif;

endif;

data_out<=count;

endprocess;

endcount_64k;

configurationsmall_countofcounteris

forcount_255

endfor;

endsmall_count;

configurationbig_countofcounteris

forcount_64k

endfor;

endbig_count;

4、程序包、库

程序包:

已定义的常数、数据类型、元件调用说明、子程序的一个集合。

目的:

方便公共信息、资源的访问和共享。

库:

多个程序包构成库。

程序包说明的内容:

常数说明;

VHDL数据类型说明;

元件说明;

子程序说明;

程序包的结构包括:

程序包说明(包首)

程序包主体(包体)

A、程序包说明(包首)

语法:

Package程序包名is

{包说明项}

End程序包名;

包声明项可由以下语句组成:

Use语句(用来包括其它程序包);

类型说明;子类型说明;常量说明;信号说明;子程序说明;元件说明。

例:

程序包说明

Packageexampleis

Typebyteisrange0to255;

Subtypenibbleisbyterange0to15;

Constantbyte_ff:

byte:

=255;

Signaladdend:

nibble;

Componentbyte_adder

Port(a,b:

inbyte;

C:

outbyte;

Overflow:

outboolean);

Endcomponent;

Functionmy_function(a:

inbyte)returnbyte;--函数声明

Endexample;

B、程序包包体

程序包的内容:

子程序的实现算法。

包体语法:

Packagebody程序包名is

{包体说明项}

End程序包名;

包体说明项可含:

Use语句;子程序说明;子程序主体;类型说明;子类型说明;常量说明。

 

程序包首与程序包体的关系

程序包体并非必须,只有在程序包中要说明子程序时,程序包体程序是必须的。

程序包首可以独立定义和使用。

如下:

Packagesevenis

Subtypesegmentsisbit_vector(0to6);

Typebcdisrange0to9;

Endseven;

注意:

我们定义的这个程序包会被自动放入到work库中。

调用:

Librarywork;

Usework.seven.all;

Entitydecoderis

Port(input:

inbcd;

Drive:

outsegments);

Enddecoder;

Architectureartofdecoderis

Begin

Withinputselect

Drive<=B”1111110”when0,

B”0110000”when1,

B”1101101”when2,

B”1111001”when3,

B”0110011”when4,

B”1011011”when5,

B”1011111”when6,

B”1110000”when7,

B”1111111”when8,

B”1111011”when9,

B”0000000”whenothers;

Endarchitectureart;

C、库的种类

VHDL库可分为5种:

(1)IEEE库

定义了四个常用的程序包:

●Std_logic_1164(std_logictypes&relatedfunctions)

●Std_logic_arith(arithmeticfunctions)

●Std_logic_signed(signedarithmeticfunctions)

●Std_logic_unsigned(unsignedarithmeticfunctions)

Std_logic_1164中的typestd_logic:

9logicvaluesystem(‘U’,’X’,’0’,’1’,’Z’,’W’,’L’,’H’,’-‘)

●‘W’,’L’,’H’isweakvalue(notsupportedbysynthesis)

●‘X’-(not‘x’)usedforunknown

●‘Z’-(not’z’)usedfortri-state

●‘-’don’tcare

注意:

单引号中必须为大写字母。

(2)STD库(默认库)

库中程序包为:

standard,其中定义了最基本的数据类型:

Bit,bit_vector,boolean,integer,real,andtime

其中,typebit

2logicvaluesystem(‘0’,’1’)

(3)面向ASIC的库

(4)work库(默认库)

(5)用户定义库

D、库及程序包的使用

库及程序包是说明总是放在实体单元前面,默认库及程序包可不作说明。

用关键字library说明要使用的库,用关键字use说明要使用的库中的程序包。

库及程序包的作用范围:

仅限于所说明的设计实体。

每一个设计实体都必须有自己完整的库及程序包说明语句。

库的使用语法:

library库名;

程序包的使用有两种常用格式:

Use库名.程序包名.项目名;

Use库名.程序包名.all;

例:

Libraryieee;

Useieee.std_logic_1164.all;

Useieee.std_logic_unsigned.conv_integer;

2选1选择器

Libraryieee;

Useieee.std_logic_1164.all;

Entitymux21is

Port(a,b:

instd_logic;

s:

instd_logic;

y:

outstd_logic);

Endmux21;

Architecturemux_aofmux21is

Begin

y<=awhens=’0’else

bwhens=’1’;

Endmux_a;

2选1选择器的另一种描述

Entitymux21is

Port(a,b:

inbit;

s:

inbit;

y:

outbit);

Endmux21;

Architecturemux_aofmux21is

Begin

y<=awhens=’0’else

bwhens=’1’;

Endmux_a;

其中,由于bit为默认库中的数据类型,所以就不用调用库了。

5、VHDL语言要素

四类语言要素:

◆数据对象(dataobject)

◆数据类型(datatype)

◆操作数(operands)

◆操作符(operator)

VHDL文字规则

(1)数字型文字

A、整数文字:

十进制整数

如:

5,678,156E2(=15600),

45_234_287(=45234287)

B、实数文字:

带小数的十进制数

如:

23.34,2.0,44.99E-2(=0.4499)

88_67_551.23_909(8867551.23909)

C、以数制基数表示的文字

格式:

基数#数字文字#E指数

如:

10#170#(=170)

2#1111_1110#(=254)

16#E#E1(=2#1110_0000#=224)或(=14*16=224)

16#F.01#E+2(=(15+1/(16*16))*16*16=3841.00)

D、物理量文字

如:

60s、100m、177A

注意:

整数可综合实现;

实数一般不可综合实现;

物理量不可综合实现;

(2)字符串型文字

按字符个数多少分为:

字符:

用单引号引起来的ASCII字符,可以是数值,也可以的符号或字母。

如:

’A’,’*’,’Z’

字符串:

用双引号引起来的一维字符数组。

字符串分为:

A、文字字符串:

“文字“

如:

“ERROR“

“XXXXXXXX”

“ZZZZZZZZ”

“X”

“bothsandqequaltoL”,

B、数位字符串:

称为位矢量,代表二进制、八进制、十六进制的数组。

其位矢量的长度为等值的二进制的位数。

格式:

基数符号“数值”

其中基数符号有三种:

B:

二进制基数符号。

O:

八进制基数符号,每一个八进制数代表一个3位的二进制数。

X:

十六进制基数符号,每一个十六进制数代表一个4位的二进制数。

如:

B“1_1101_1110”二进制数数组,长度为9

O“34”八进制数数组,长度为6

X“1AB”十六进制数数组,长度为12

C、标识符

定义常数、变量、信号、端口、子程序或参数的名字。

基本标识符的要求(87标准):

◆以英文字母开头;

◆不能连续使用下划线“_”;

◆不能以下划线“_”结尾;

◆是由26个大小写英文字母、数字0~9及下划线“_”组成的字符串。

◆基本标识符中英文字母是不区分大小写的;

◆VHDL的保留字不能作为标识符使用。

合法标识符如下:

My_counter、Decoder_1、FFT、Sig_N、Not_Ack、State0

非法标识符如下:

_Decoder_1、2FFT、Sig_#N、Not-Ack、ALL_RST_、DATA__BUS、return、entity

扩展标识符(93标准)

以反斜杠来界定,免去了87标准中基本标识符的一些限制。

●可以以数字大头,

●允许包含图形符号,

●允许使用VHDL保留字,

●区分字母大小写等。

如:

\74LS163\、\Sig_#N\、\entity\、\ENTITY\

D、下标名及下标段名

下标名:

用于指示数组型变量或信号的某一元素。

格式:

标识符(表达式)

下标段名:

用于指示数组型变量或信号的某一段元素。

格式:

标识符(表达式to/downto表达式)

如:

a:

std_logic_vector(7downto0)

a(7),a(6),a(5)…a(0)

a(7downto0),a(7downto4),a(5downto3)…

6、数据对象

三种对象:

常量(constant)

变量(variable)

信号(signal)

三种对象的物理含义:

⏹常量代表数字电路中的电源、地、恒定逻辑值等常数;

⏹变量代表暂存某些值的载体,常用于描述算法;

⏹信号代表物理设计中的某一条硬件连接线,包括输入、输出端口。

三种对象的特点及说明场合:

信号:

全局量,

用于architecture、package、entity。

变量:

局部量,

用于process、function、procedure。

常量:

全局量,

可用于上面两种场合。

(1)常量说明

对某一个常量名赋予一个固定的值。

格式:

constant常量名:

数据类型:

=表达式;

例:

constantdata:

bit_vector(3downto0):

=”1010”;

Constantwidth:

inetger:

=8;

Constantx:

new_bit:

=’x’;

注意:

常量数据类型必须与表达式的数据类型一致。

常量的可视性(作用范围):

常量是全局量,其作用范围取决于常量被定义的位置。

⏹常量在库或程序包中声明,那么在之后的实体中任何地方都可使用。

⏹常量定义在实体中,那么在实体中的任何一个结构体都是可以使用的,但只能在该实体中有效。

⏹常量定义在结构体中,那么常量只能在该结构体中任何地方使用,但不能在其它结构体中使用。

(2)变量说明

变量是一个局部量,只能在进程和子程序中定义、使用。

其作用范围仅限于定义了变量的进程和子程序中。

格式:

Variable变量名:

数据类型约束条件:

=表达式;

例:

Variablea,b

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 成人教育 > 电大

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1