今天给大侠带来的是一周掌握 FPGA VHDL Day 1,今天开启第一天,下面咱们废话就不多说了,一起来看看吧。
在学习中,学习任何东西都有一个过程,一个初步认识到慢慢了解再到精通掌握的过程,当然,学习 VHDL 语法也是一样,首先你要了解什么是VHDL,然后结合实践再遵从理论,你才可能理解的更加迅速更加透彻。每日十分钟,坚持下去,量变成质变。
VHDL语言
VHDL:
VHSIC Hardware Description Language.
HDL----Hardware Description Language
一种用于描述数字电路的功能或行为的语言。目的是提为电路设计效率,缩短设计周期,减小设计成本,可在芯片制造前进行有效的仿真和错误检测。
优点:HDL设计的电路能获得非常抽象级的描述。如基于RTL(Register Transfer Level)描述的IC,可用于不同的工艺。
HDL设计的电路,在设计的前期,就可以完成电路的功能级的验证。
HDL设计的电路类似于计算机编程。
常用的HDL语言:VHDL 、Verilog HDL
VHDL 概述:
VHDL VHSIC Hardwarter Description Language
VHSIC Very High speed integrated circuit
- VHDL是美国国防部在20世纪80年代初为实现其高速集成电路硬件VHSIC计划提出的描述语言。
- IEEE从1986年开始致力于VHDL标准化工作,融合了其它ASIC芯片制造商开发的硬件描述语言的优点,于93年形成了标准版本(IEEE.std_1164)。
- 1995年,我国国家技术监督局推荐VHDL做为电子设计自动化硬件描述语言的国家标准。
VHDL优点:
- 覆盖面广,系统硬件描述能力强,是一个多层次的硬件描述语言;
- VHDL语言具有良好的可读性,既可以被计算机接受,也容易被人们所理解;
- VHDL语言可以与工艺无关编程;
- VHDL语言已做为一种IEEE的工业标准,便于使用、交流和推广。
VHDL语言的不足之处:
设计的最终实现取决于针对目标器件的编程器,工具的不同会导致综合质量不一样。
一、VHDL语言基础
1.1 标识符(Identifiers)
标识符用来定义常数、变量、信号、端口、子程序或参数的名字,由字母(A~Z,a~z)、数字(0~9)和下划线(_)字符组成。
要求:
- 首字符必须是字母
- 末字符不能为下划线
- 不允许出现两个连续的下划线
- 不区分大小写
- VHDL定义的保留字(关键字),不能用作标识符
- 标识符字符最长可以是32个字符。
注释由两个连续的虚线(--)引导。
关键字(保留字):关键字(keyword)是VHDL中具有特别含义的单词,只 能做为固定的用途,用户不能用其做为标识符。
例如:ABS,ACCESS,AFTER,ALL,AND,ARCHITECTURE,ARRAY,ATTRIBUTE,BEGIN,BODY,BUFFER,BUS,CASE , COMPONENT,CONSTANT,DISCONNECT,DOWN TO,ELSE, ELSIF,END,ENTITY,EXIT,FILE,FOR,FUNCTION, GENERIC,GROUP,IF,INPURE,IN,INOUT,IS,LABEL,LI BRARY,LINKAGE,LOOP,MAP,MOD,NAND,NEW,NEXT, NOR ,NOT,NULL,OF,ON,OPEN ,OR ,OTHERS,OUT, PACKAGE,POUT,PROCEDURE ,PROCESS,PURE,RANGE , RECODE,REM,REPORT,RETURN,ROL,ROR,SELECT, SHARED,SIGNAL,SLA,SLL,SRA,SUBTYPE,THEN, TRANSPORT,TO,TYPE,UNAFFECTED,UNITS,UNTIL,USE,VARIABLE ,WAIT,WHEN,WHILE,WITH,XOR ,XNOR
1.2 数据对象(Date Objects)
数据对象包括常量、变量、信号和文件四种类型。
- 常量Constant
常量是对某一常量名赋予一个固定的值,而且只能赋值一次。通常赋 值在程序开始前进行,该值的数据类型则在说明语句中指明。
Constant 常数名:数据类型:=表达式
Constant Vcc:real:=5.0; --定义Vcc的数据类型是实数,赋值为5.0V
Constant bus_width:integer := 8; --定义总线宽度为常数8
常量所赋的值应和定义的数据类型一致;
常量在程序包、实体、构造体或进程的说明性区域内必须加以说明。定义在程序包内的常量可供所含的任何实体、构造体所引用,定义在实体说明内的常量只能在该实体内可见,定义在进程说明性区域中的常量只能在该进程内可见。
- 变量Variable
变量只能在进程语句、函数语句和过程语句结构中使用。变 量的赋值是直接的,非预设的,分配给变量的值立即成为当前 值,变量不能表达“连线”或存储元件,不能设置传输延迟量。
变量定义语句:
Variable 变量名:数据类型 :=初始值;
Variable count: integer 0 to 255:=20 ;-- 定义count整数变量,变化范围0~255,初始值为20。
变量赋值语句:
目标变量名 := 表达式;
x:=10.0; -- 实数变量赋值为10.0
Y:=1.5 x; -- 运算表达式赋值,注意表达式必须与目标变量的数据类型相同 A(3 to 6):=(“1101”); --位矢量赋值
- 信号Signal
信号表示逻辑门的输入或输出,类似于连接线,也可以表达存储元件的状态。信号通常在构造体、程序包和实体中说明。
信号定义语句:
Signal 信号名: 数据类型 :=初始值
Signal clock:bit :=‘0’; --定义时钟信号类型,初始值为0
Signal count:BIT_VECTOR(3 DOWNTO 0); --定义count为4位位矢量
信号赋值语句:
目标信号名 <= 表达式;
x<=9;
Z<=x after 5 ns; -- 在5ns后将x的值赋予z
1.3 数据类型
- VHDL的预定义数据类型
在VHDL标准程序包STANDARD中定义好,实际使用过程中,已自动包含进VHDL源文件中,不需要通过USE语句显式调用。
- 布尔:(Boolean) TYPE BOOLEAN IS (FALSE, TRUE); -- 取值为FALSE和TRUE,不是数值,不能运算,一般用于关系运算符
- 位: ( Bit ) TYPE BIT IS (‘0’,’1’); --取值为0和1,用于逻辑运算
- 位矢量: ( Bit_Vector )
TYPE BIT_VECTOR IS ARRAY (Natural range<>) OF BIT; -- 基于Bit类型的数组,用于逻辑运算 SIGNAL a:Bit_Vector(0 TO 7);
SIGNAL a:Bit_Vector ( 7 DOWNTO 0)
- 字符:(Character) TYPE CHARACTER IS (NUL, SOH,STX, …, ‘ ’, ‘!’,…); --通常用‘’引起 来,区分大小写;
- 字符串:(String) VARIABLE string_var: STRING (1 TO 7);string_var:=“A B C D” ; -- 通常用“”引起来,区分大小写;
- 整数:(Integer) 取值范围 -(231-1) ~(231-1),可用32位有符号的二进制数表示 variable a:integer range -63 to 63
在实际应用中,VHDL仿真器将Integer做为有符号数处理,而 VHDL综合器将Integer做为无符号数处理;
要求用RANGE子句为所定义的数限定范围,以便根据范围来决定表示此信号或变量的二进制数的位数。
- 实数:(Real)
取值范围 -1.0E38 ~ 1.0E38,仅用于仿真不可综合
1.0 --十进制浮点数
8#43.6#e 4 --八进制浮点数
43.6E-4 --十进制浮点数
- 时间:(Time) 物理量数据,完整的包括整数和单位两个部分,用至少一个空格隔开,仅用于仿真不可综合; fs,ps,ns,us,ms,sec,min,hr
- 错误等级(Severity Level) : 表示系统状态,仅用于仿真不可综合;
TYPE severity_level IS (NOTE、WARNING、ERROR、FAILURE);
- IEEE预定义标准逻辑位与矢量
- 标准逻辑位(Std_Logic)
U:Uninitialized;
X:Forcing Unkown;
0:Forcing 0
1:Forcing 1
Z:High Impedance
W:Weak Unknown
L:Weak 0
H:Weak 1
—:Don’t care
- 标准逻辑位矢量( Std_Logic_vector)
基于Std_Logic类型的数组;
使用Std_Logic和 Std_Logic_Vector要调用IEEE库中的Std_Logic_1164 程序包;就综合而言,能够在数字器件中实现的是“-、0、1、Z”四种状态。
在条件语句中,必须要全面考虑Std_Logic的所有可能取值情况,否则综 合器可能会插入不希望的锁存器。
- 用户自定义
- TYPE 数据类型名,IS 数据类型定义 ,OF 基本数据类型 或 TYPE 数据类型名, IS 数据类型定义
数组:
代码语言:javascript复制type value_type is array (127 downto 0) of integer;
type matrix_type is array (0 to 15, 0 to 31) of std_logic;
枚举:
代码语言:javascript复制type states is (idle,decision,read,write);
type boolean is (false,true);
type bit is (‘0’,‘1’);
- SUBTYPE 子类型名 IS 基本数据类型定义 RANGE 约束范围
subtype digit is integer range 0 to 9;
1.4 数据类型转换
VHDL为强定义类型语言,不同类型的数据不能进行运算和直接赋值。
- 类型标记法
Variable A: integer;
Variable B: real;
A= integer (B);
B=real (A);
- 函数法
Conv_interger (A);--由std_logic转换为integer型,在std_logic_unsigned包。
- 常数转换法 / 常量转换法
Type conv_table is array(std_logic) of bit;
Constant table: conv_table:=(‘0’|’L’=>’0’, ‘1’|’H’=>’1’, others=>’0’);
Signal a: bit; signal b: std_logic;
A<=table(b); -- 将std_logic型转换为bit型
在“STD_LOGIC_1164”、“STD_LOGIC_ARITH”和 “STD_LOGIC_UNSIGNED”的程序包中提供的数据类型变换函数。
- 属性
属性提供的是关于信号、类型等的指定特性。
‘event:若属性对象有事件发生,则生成布尔值“true”,常用来检查时钟边沿是否有效。
上升沿:Clock’ EVENT AND Clock=‘1’
’range:生成一个限制性数组对象的范围
’range: “0 to n” ;’reverse_range:“n downto 0”
’left:生成数据类型或数据子类型的左边界值;
’right , ’high, ’low, ’length
- 运算符
算术运算符:+, -, *, / , MOD, REM ,SLL ,SRL ,SLA, SRA ,ROL ,ROR ,**,ABS
关系运算符:=, /=,<, > , <=, >=
逻辑运算符:AND,OR,NAND,NOR,XNOR,NOT,XOR
赋值运算符:<=,:=
关联运算符:=>
其他运算符:+, -,&
- 并置操作符 &
SIGNAL a : STD_LOGIC_VECTOR (3 DOWNTO 0) ;
SIGNAL d : STD_LOGIC_VECTOR (1 DOWNTO 0) ;
...
a <= '1'&'0'&d(1)&'1' ; -- 元素与元素并置,并置后的数组长度为4
...
IF a & d = "101011" THEN ... –- 在IF条件句中可以使用并置符
- 运算符优先级别
逻辑、算术运算符( NOT,**,ABS)
乘法运算符(/ , MOD, REM, * )正负运算符:+, -,
加减、并置运算符:+, -, &
关系运算符:=, /=,<, > , <=, >=
逻辑运算符:AND,OR,NAND,NOR,XNOR,NOT,XOR
移位运算符的左边为一维数组,其类型必须是BIT或BOOLEAN, 右边必须是整数移位次数为整数的绝对值。
移位运算符操作示意图
SLL:将位向量左移,右边移空位补零;
SRL:将位向量右移,左边移空位补零;
SLA:将位向量左移,右边第一位的数值保持原值不变;
SRA:将位向量右移,左边第一位的数值保持原值不变;
ROL和ROR:自循环左右移位。
“1100”SLL1 =“1000”
“1100”SRL1 =“0110”
“1100”SLA1 =“1000”
“1100”SRA1 =“1110”
“1100”ROL1 =“1001”
“1100”ROR1 =“0110”
- 取余运算
(a REM b)的符号与a相同,其绝对值小于b的绝对值。
例如:(-5)REM 2=(-1) 5 REM 2=(1)
- 取模运算
(a MOD b)的符号与b相同,其绝对值小于b的绝对值。
例如:(-5)MOD 2=1 5 MOD (- 2)=(-1)
Day 1 就到这里,Day 2 继续开始VHDL基本结构。
END