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