关于VHDL语言的学习
一.一个系统用VHDL描述,整体上包括库,程序包,实体和结构体。
实体:就是整个系统,如果给整个系统取个名字的话,那么这个名字就是实体名。实体描述有固定的语句:
entity 实体名 is
Port(端口表);
end 实体名;
结构体:就是描述实体所完成的功能,整个系统所要完成的功能,在结构中描述出来。
结构也有固定的语句:architecture 结构名 of 实体名 is
【说明语句】
begin
【功能描述】
end结构名;
备注:这一项是VHDL语言的一个整体概括,每一个用VHDL描述出来的工程都是这种模式:实体,结构。
实例: 库和程序包
library ieee; use ieee.std_logic_1164.all;
|
entity nand_2 is port(a:in std_logic; b:in std_logic; c:out std_logic ); end nand_2;
|
architecture one of nand_2 is
begin
y<=a nand b;
end one;
结构体部分:
二.库
IEEE是最常见的一个库,每个VHDL程序开头都要调用该库:
调用语句:library 库名;
库里又有一些程序包,IEEE库中的4个程序包:
①std_logic_1164;② std_logic_arith;③std_logic_signed;④std_logic_unsigned;
调用程序包的语句:
调用语句:use 库名.程序包名.all
例如调用IEEE库中的std_logic_1164程序包:use ieee.std_logic_1164.all;
三.端口
共有5种类型的端口:分别是In, Out, Inout, Buffer及Linkage。
常用的是前3个,buffer最好不要使用,Linkage几乎不用。端口这一块的重点和难点是inout模式
四. VHDL的语言要素
1.VHDL语言中的:①文字规则;②数据对象;③数据类型;④操作运算符等基础知识。(这些都是最基本的东西,可自己看资料消化)
这一部分知识里有一个数据类型转换:数据类型转换都是调用转换函数,程序包提供转换函数。
std_logic_1164程序包的转换函数有:
to_std_logic_vector(a) --由bit_vector转成std_logic_vector;
to_bit_vector(a) --由std_logic_vector转成bit_vector;
to_std_logic(a) --由bit转成std_logic;
to_bit(a) --由std_logic转成bit;
std_logic_arith程序包的转换函数有:
conv_std_logic_vector(a,位长)--由integer, signed, unsigned转成std_logic_vector;
conv_integer(a) --由signed,unsigned转成integer;
conv_unsigned(a) --由signed,integer转成unsigned;
std_logic_unsigned程序包的转换函数有:
conv_integer(a) --由std_logic_vector转成integer;
备注:如果程序中用到了相关的转换函数,必须要调用相应的程序包。
2.顺序语句(常用的语句):
①IF语句
第一种结构:if 条件句 then
顺序语句
end if
第二种结构:if 条件句 then
顺序语句
else
顺序语句
end if
第三种结构:if 条件句1 then
顺序语句
elsif 条件句2 then
顺序语句
…………
else
顺序语句
end if
②CASE语句
语句结构:case 表达式 is
when 选择值=>顺序语句;
when 选择值=>顺序语句;
………………
when others=>顺序语句;
end case;
③LOOP语句(循环语句)
语句结构1:[loop标号:] loop
顺序语句
exit [loop 标号] when 条件语句
end loop [loop 标号:]
实例:ff: loop
a:=a+1;
exit ff when a>10;
end loop ff; --当a大于10时推出循环
语句结构2:[loop标号:] for 循环变量 in循环次数范围 loop
顺序语句
end loop [loop 标号:]
语句结构3:[标号:] while循环控制条件 loop
顺序语句
end loop [标号];
3.并行语句(常用的语句)
①进程语句
②并行信号赋值语句
第一种结构:赋值目标<=表达式 when赋值条件 else
表达式 when 赋值条件 else
……
表达式;
第二种结构:with选择表达式 select
赋值目标<=表达式 when选择值,
表达式 when 选择值,
……
表达式 when 选择值;
③元件例化语句
五. 状态机(状态机的三种类型编码与速度)
状态机的编码方式有:二进制,枚举,格雷码,独热码
①二进制:状态序列如同计数器序列,S1 = 001, S2=010, S3=011, S4=100,……
②枚举:状态有指定的值,S1=100, S2=110, S3=101, S4 = 111,…
③One Hot(独热):每个状态只有一个寄存器有效,S1=00000001, S2=00000010, S3=00000100, etc…
备注:在状态机从当前状态跳到下一状态时,二进制和枚举类型有大量的反馈输入。这对CPLD来说是比较合适的。
在FPGA中,使用二进制和枚举类型可能会占用较少资源——但肯定比one-hot 编码慢。
One Hot每个状态只需提供一位反馈输入
对于较大的状态机,使用One Hot编码
二进制或者枚举编码,对于较小的状态机合适。
记住四输入查找表!状态机可能会有很多的扇入,和大量的反馈,对速度不利
使用One Hot, 并限制输入状态数,使输入限制到4-5,可以达到最高的速度