1认识VHDL
HDL(Hardware Description Language)是复杂数字电路实际设计的一种必要手段,通过语言的形式把我们心中的电路描述出来,同时配套相应的翻译工具,就是我们的综合工具,把语言描述的电路综合为真实门级电路,通过网表文件记录。主流的硬件描述语言有A-HDL,V-HDL,Verilog-hdl。
在国内三种语言中,Verilog-hdl占据90%,V-HDL占据9%,A-HDL占据1%。
Vhdl是美国军方开发的一种RTL级语言,它有自己的特点,具体特点如下:
1.语言严谨
VHDl由于语法严谨,约束我们的书写结构,不容出现bug,因此有些对电路稳定性要求较高的设计单位采用该vhdL.
2.数据类型丰富
VHD支持丰富的数据类型,不同的数据类型不能进行值的传递。
3.支持局部信号
VHDL支持进程局部信号,即变量,verilog只支持全局信号。
1.1语言的文件组织结构
Verilog将设计封装为模块module …. endmodule ,vhdl将设计分为4个部分,分别是库,包,结构体,实体。
1.1.1库
存放所有设计相关文件的仓库,在计算机中为一段存储空间,这个存储空间有物理映射名字,这个名字就叫做库名,规定库不能由用户定义,只能有语言的设计者或相关授权。
Library 库名;
Use 库名.包名.项;
Use 库名.包名.all;
1.IEEE库
标准库,IEEE为美国电子机电工程师学会指定的库,也是使用最常见的库。
2.STD库
语言预定义库,本质上是IEEE库的扩展
3.VITAL库
针对ASIC设计提供了一些高进度,高效率的仿真模型。
4.Work
临时库,用来存放所有与用户设计相关的文件
1.1.2包
用来定义电路设计中的公共属性(参数,函数),相当于C语言的头文件。
pachage 包名 is
定义常量;
定义函数;
……
end 包名;
pachage body 包名 is
函数体;
end 包名;
包可以由用户定义,也可以预定义包,常见的预定义包如下:
1.STD_LOGIC_1164
定义了一些数据类型,子类型,以及相关函数,其中STD_LOGIC和STD_LOGIC_VECTOR这俩数据类型在电路设计中对信号定义非常重要,代替了bit和bit_vector。
2.STD_LOGIC_ARITH
定义了数学运算相关的运算符以及相关函数,包括有符号数和无符号数运算
3.STD_LOGIC_SINGED
它是STD_LOGIC_ARITH包的完善,主要是针对有符号数据定了有符号数运算相关的符号以及函数。
4.STD_LOGIC_unSINGED
它是STD_LOGIC_ARITH包的完善,主要是针对无符号数据定了有符号数运算相关的符号以及函数。
1.1.3实体
用来定义一个电路模块的外部属性,外部属性包括端口和模块参数
Module #(参数) 模块名( 端口);endmodule
Entity 模块名 is
Port
(
Clk:in std_logic;
Dout:out std_logic_vector(7 downto 0 )
);
Generic
(
Constant COL : std_logic_vector(7 downto 0 ) := 8
);
End模块名;
1.1.4定义模块的内部结构
Architecture 结构体名 of 模块名 is
定义信号;
定义元件;
定义常量;
Begin
行为建模;port map;
数据流建模块;wen语句,with语句;
结构建模;process
End 结构体名;
2vdhl基本语法
2.1数的表示
在HDL中数的表示与量的属性有关,量有逻辑和数学2种,换句话说就是量是数学类型还是逻辑类型。
1.数学类型
如果量(常量,信号,变量)如果是数学类型,比如integer ,数的表示如下:
10#170#( 10进制数170)
2#101011#( 2进制数101011)
16#A5#( 2进制数a5)
10#170#E2( 10进制数170 *102)
2#101011#E3( 2进制数101011*23)
16#A5#E4( 2进制数a5*164)
2.逻辑类型
如果量(常量,信号,变量)如果是逻辑类型,比如std_lotic_vetor ,数的表示如下:
B“10101010”(表示二进制数10101010)
“10101010” (表示二进制数10101010)
O“ 34 ” (表示八进制数10101010)
X”A5” (表示十六进制数A5,),量的位宽必须是4的整数倍
2.2位的表示
MSB:LSB 如:( 7 downto 0 ) range 0 to 31;
LSB:MSB 如:( 0 to 7 )
2.3沿的表示
1.上升沿
如:clk’evnet and clk =‘1’
Rising_edge(clk);
2.下降沿
如:clk’evnet and clk =‘0’
falling_edge(clk);
2.4运算符
+-*/:加减乘除 如: a + b
+- :符号运算符 如: +a , -a
& :为拼接 如: a[7:0] &b[3:0] {a[7:0],b[3:0]}
关系运算符
= 如: a=b
\= 如: a\=b
< 如: a <b< span>
</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
Xnor :同或 如:a xnor b
Not : 非 如何 not a;
移位运算符
Sll :逻辑非循环左移 如何 as s ll 2;
Srl :逻辑非循环右移
Sla :数学非循环左移
Sra :数学非循环右移
Rol : 逻辑循环左移
Ror : 逻辑循环右移
=> :左边和右边有关联
2.5数据类型
VHDL数据类型包括三种,常规数据类型,子类,自定义数据类型
2.5.1常规数据类型
1.数学类型
Integer :正数类型
Real :实数
Boolean :布尔量,true false
Character :字符
String :字符串
Natural :自然数
Positive :正整数
Time :时间类型
Severity level:错误等级 NOTE ,warnong error failure
2.逻辑类型
Bit:单比特数据类型,std_logic代替
Bot_vector:多比特数据类型,std_loginc_vector代替
2.5.2自定数据类型
Type ST_COE is (S0,S1,S2,S3);--定义枚举
Type mem is array (255 downto 0) of std_logic_vector ( 7 downto 0);--定义数组
2.5.2子类型
VHLD允许对原数据类型重载,如:subtype my_integer is integer range 0 to 31 ;
2.6量的定义
1.常量
Constant COL : STD_LOGIC_VECTOR (7 DOWNTO 0) :=0;
2.变量(局部信号,在process定义)
Variable a : STD_LOGIC_VECTOR (7 DOWNTO 0) :=0;
3.信号
Signal a : STD_LOGIC_VECTOR (7 DOWNTO 0) :=0;
2.7赋值
1.初始化赋值
不管信号还是变量赋值一律使用:=
2.信号赋值
信号赋值一律用<=
3.变量赋值
变量赋值一律用:=