VHDL语言要素
库:存放已编译的实体、结构体、程序包和配置
程序包:存放各种设计模块能共享的数据类型、常数、程序等
实体:描述所设计硬件系统的外部接口信号
结构体:描述所设计硬件系统的内部结构和功能
配置:从库中选取所需单元来组成新系统。
VHDL大小写不敏感
库(对应文件夹)
格式:
LIBRARY 库名 ;
常见库名:IEEE、STD、WORK
其中STD和WORK使用不需要额外说明
程序包(对应文件)
格式:
USE 包名;
常用:IEEE.LOGIC_1164.ALL
STD_LOGIC_ARITH、STD_LOGIC_SIGNED
实体定义(定义黑盒子)
ENTITY<实体名>IS
[类属参数说明];
[端口说明部分*];
port(
A,B: in std_logic;
Co: out std_logic;
S: out std_logic
);
[实体说明部分];
END<实体名>
结构体
ARCHITECTURE<结构体名>OF<实体名>IS --结构提名随意
[结构体说明部分];
BEGIN
<并行处理语句>; --注意这里的语句是并行处理的,没有先后顺序
END<结构体名>
结构体种即存在并行语句,又存在串行语句
并行语句:描述一组并发行为,并发执行,与程序书写顺序无关
并行语句:描述一组严格顺序执行的行为。与程序的书写顺序有关(在PROCESS、FUNCTION)
PROCESS[敏感信号表] --敏感信号发生变化,引发进程开始。不加敏感信号永远执行
[进程说明部分];
BEGIN
<进程语句部分>;
END PROCESS
一种功能的两种实现:
BEGIN
X<= A AND B;
Y<= A OR B;
END behave;
BEGIN
p1: PROCESS(A,B)
BEGIN
X<= A AND B;
END PEOCESS p1; --执行到这里才真正给X赋值
p2: PROCESS(A,B)
BEGIN
Y<= A OR B;
END PEOCESS p2; --执行到这里才真正给Y赋值,正确理解延迟赋值
END behave;
信号赋值语句
目标信号<=表达式1 when 条件1 else --条件信号赋值
表达式2 when 条件2 else
...
表达式n;
while 表达式 select --选择信号赋值语句
目标信号 <= 表达式1 when 选择条件1,
表达式2 when 选择条件2,
...
表达式n when 选择条件n,
if\case\for loop\while loop --顺序描述语句(只在process里用)
三大对象
- 常量constant
- 变量variable
- 在综合以后,变量没有对应硬件
- 变量只能在进程,过程和函数中使用和定义(顺序过程,这三者里语句可串行)
- 变量的赋值立即见效(只能存在于串行语句中,不能再结构体的第一层次上使用)
- 信号signal
- 在综合(将VHDL代码转换成逻辑电路的过程)以后有实际的对应硬件
- 赋值有延迟,表示:
:=
。 - 实体的所有端口都默认为信号。
延迟赋值:
信号<=表达式
立即赋值:变量:=表达式
IEEE数据类型标准
- std_logic:不是开关变量,有9种取值(9值逻辑系统)
- std_logic_vector:多位
结构体三种描述方式
数据流描述方式
前提条件,有实际电路,能画出真值表和电路图
描述的电路是可综合的(可以有实际的电路来实现)。
ARCHITETURE rtl OF full_adder IS
SIGNAL tmp1,tmp2 :std_logic;
BEGIN
tmp1<= A XOR B;
tmp2<= tmp1 AND Cin;
S<= tmp1 XOR Cin;
Co<= tmp2 OR (A AND B);
END rtl;
结构描述方式
多层次设计中,用过调用库中的原件或是已经设计好的模块来完成设计实体功能的描述。(定义很多组件componenet)
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
ENTITY half_adder IS
PROT (A,B: IN std_logic;
Co:OUT std_logic;
S:OUT std_logic);
END half_adder;
ARCHITECTURE rtl OF half_adder IS
SIGNAL tmp1, tmp2: std_logic;
BEGIN
tmp1 <= A OR B;
tmp2 <= A NAND B;
Co <= NOT tmp2;
s <= tmp1 AND tmp2;
END rtl;
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
ENTITY full_adder IS
PORT(A,B: IN std_logic;
Cin: IN std_logic;
Co: OUT std_logic;
S: OUT std_logic);
END full_adder;
ARCHITECTURE stuucture OF full_adder IS
SIGNAL tmp1, tmp2, tmp3: std_logic;
COMPONENT haf_adder
PORT(A,B: IN std_logic;
Co: OUT std_logic;
S:OUT std_logic);
END COMPONENT;
COMPONENT or_gate --相当于声明
PORT(a,b: IN std_logic;
c: OUT std_logic);
END COMPONENT;
BEGIN
U0: haf_addder
PORT MAP(A=>A, B=>B, S=>tmp1, Co=>tmp2); --将设计的端口名称替换为被调用组件的端口名
U1: haf_adder
PORT MAP (A=>tmp1, B=>Cin, S=>S, Co=>tmp3);
U2: or_gate
PORT MAP (A=>tmp1, B=>Cin, S=>S, Co=>tmp3);
END structure;
行为描述方式
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
ENTITY full_adder IS
PORT (A,B,Cin: IN std_logic;
Co, S: OUT std_logic);
END full_adder;
ARCHITECTURE behave OF full_adder IS
BEGIN
PROCESS(A, B, Cin)
VARIABLE n: integer EANGE 0 TO 3;
CONSTANT S_vector: std_logic_vector(0 TO 3):="0101";
CONSTANT Co_vector: std_logic_vector(0 TO 3):="0011"
BEGIN
n:= 0;
IF(A = '1')THEN
n:= n+1;
END IF;
IF(B = '1') THEN
n:=n+1;
END IF;
IF(Cin = '1') THEN
n:= n+1;
END IF;
s<=S_vector(n);
Co<=Co_vector(n);
END PROCESS;
END behave;
关于三种结构体描述方式的理解:
看个人习惯。
数据流描述方式建立在有对应电路图的基础上,相对描述最简单。
结构体描述方式利用类似函数的思想,分层级描述,更适合大规模复杂电路的描述。
行为描述方式更适合概念驱动的电路实现,有真值表就可以写。