VHDL
Tags
Last edited by
AI summary
Last edited time
Dec 26, 2024 02:29 PM
1 认识vhd语言1.1 RTL HDL语言特点1.2 VHDL语言文件组织形式1.2.1 库1.2.2 包1.2.3 实体1.2.4 结构体2 VHDL语言基本语法2.1 数的表示2.2 位的表示2.3 沿的表示2.4 操作符2.5 数据类型2.6 量2.7 赋值3 练习
1 认识vhd语言
作为数字电路设计工具之一HDL,rtl级描述语言目前主要有三种verilog,ahdl,vhdl三种,在国内以verilog为主,在一些研究所军工类企业也有要求用VHDL语言的,至于AHDL语言国内使用非常少。
1.1 RTL HDL语言特点
Verilog,ahdl,vhdl都属于RTL级建模语言,对于系统算法级建模语言为system verilog和system c使用率较高。
VHDL / verilog | 特点 | 特点 |
描述层次 | RTL | RTL |
语法结构 | 严谨 | 灵活 |
文件格式 | 包括库,包,实体,结构等 | 包括头文件,模块 |
数据类型 | 强数据类型(2个不同数据类型的信号是不可以赋值)
数据类型较为丰富
| 弱数据类型
数据类型少 |
量 | 常量
信号
变量(局部信号) | 常量
信号 |
进程 | Process | allways
initial |
赋值 | :=(初始化,变量赋值)
<=(信号赋值) | =(阻塞赋值)
<=(非阻塞赋值) |
建模 | 流建模(wen,with)
结构建模(定义元件)
行为建模(pross) | 流建模(assign )
结构建模(直接例化,不需要定义元件)
行为建模(always) |
1.2 VHDL语言文件组织形式
任何语言都是通过文件直接表示出来,verilog通过模块文件表示,VDHL通过包,库,结构体,实体组织语言。
1.2.1 库
库是存放vhdl设计的存储空间,每个存储空间都以物理映射,映射名字就是库名,任何语言描述的设计文件都必须保存在库中,库不能由用户定义,只能是语言设计者或者授权单位或者个人定义。
Library 库名;
Use 库名.报名,项名;
库名 | 说明 |
IEEE | 标准库,语言自带的库 |
STD | IEEE库扩展标准库 |
VITAL | 针对ASIC设计提供的高精度仿真模型 |
Work | 临时库,用来存放所有用户设计有关的文件 |
1.2.2 包
包用来定义VHDL语言的公共属性(常量,函数),即为头文件,用与其他设计定义的常量或者文件。
Package 包名 is
定义函数;
定义常量;
End 包名;
注意:为了方便函数的引用,vhdl语言引入了包体的理念
Package body 包名 is
函数实现;
End 包名;
1.2.3 实体
实体用来定义模块的外部属性,外部数据包括端口定义,模块参数
Entity 模块名 is
Port
(
a : std_logic_vertor (7 downto 0);
…..
);
Generic
(
Constant COL_MAX : std_logic_vertor (7 downto 0) := 600
);
End 模块名;
1.2.4 结构体
结构体用来描述模块的内部行为,即电路功能描述,通过流建模,行为建模,结构建模方式描述电路行为。
Architecture 结构体名 of 模块名 is
Compent 元件名 is
End Compent;
Begin
#流建模
When …
With …
直接赋值;
#结构建模
Port map
…
#行为建模
Process ()
Begin
End process;
End 结构体名;
2 VHDL语言基本语法
2.1 数的表示
数学类型数表示
10#180#:表示10进制数180 如:a := 10#180#;
10#180#e2:表示10进制数180*102 如:a := 10#180#e2;
2#10101#:表示20进制数10101 如:a := 2#10101#;
2#10101#e2:表示2进制数10101*22 如:a := 2#10101#e2;
16#AB#:表示16进制数AB 如:a := 16#AB#;
16#AB#E3:表示16进制数AB*163 如:a := 16#AB#E3;
逻辑类型数的表示
B“10101” :表示二进制数10101
O“25” :表示8进制数25
X”AB” :表示16进制数AB,注意信号的位宽必须是4的正数倍,否则无法赋值
2.2 位的表示
[7:0] : (7 downto 0)
[0:7] : (0 to 7)
2.3 沿的表示
上升沿
下降沿
2.4 操作符
运算符 | 说明 | 例子 |
基本运算符 | ㅤ | |
+ | 加法 | C<=a+b; |
- | 减法 | C<=a-b; |
* | 乘法 | C<=a*b; |
/ | 除法 | C<=a/b; |
Rem | 取余 | C<=rem a; |
符号运符 | ㅤ | ㅤ |
+ | 正数 | C<=+a; |
- | 负数 | C<=-a; |
拼接运算符 | ㅤ | ㅤ |
& | 位拼接 | C<=a(7 downto 0) & b(6 downto 0) |
关系运算符 | ㅤ | ㅤ |
= | 等于 | a=b |
\= | 不等于 | a\=b |
< | 小于 | A<b |
<= | 小于等于 | A<=b |
> | 大于 | a>b |
>= | 大于等于 | a>=b |
逻辑运算符(不支持位运算) | ㅤ | ㅤ |
And | 与 | A and b |
Or | 或 | A or b |
nand | 与非 | A nand b |
nor | 或非 | A nor b |
xor | 异或 | A xor b |
Nxor | 同或 | A nxor b |
关联运算符 | ㅤ | ㅤ |
=> | 关联 | 需在case pot map下使用 |
2.5 数据类型
标准数据类型
- 数学类型
Integer:整数型
Real:实数类型
Boolean:布尔量
Character:字符类型
StringL:字符串类型
Natural:自然数类型
Positive:正整数类型
Time:时间类型
Severity level:错误等级类型
- 逻辑类型
bit:单比特逻辑类型
bit_vector:多比特逻辑类型
std_logic:单比特逻辑类型
std_logic_vector:多比特逻辑类型
- 自定义数据类型
特殊类型
Type mem is array (7 downto 0) of std_logic_vector (255 downto 0);
Type SATE_CODE IS(S0,S1,S2,S3);
子类型(支持重载)
Subtype my_integer is integer range 0:255;
2.6 量
常量
信号
变量(局部信号,只能在进程语句中申明)
2.7 赋值
- 初值
所有的量(常量,变量,信号)赋初值用:=
- 信号赋值
信号赋值用<=
- 变量赋值
变量赋值用:=
3 练习

Loading...