一周掌握 FPGA VHDL Day 1

2020-12-30 14:48:00 浏览数 (1)

大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分。大侠可以关注FPGA技术江湖,在“闯荡江湖”、"行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢。

今天给大侠带来的是一周掌握 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 约束范围
代码语言:javascript复制
subtype digit is integer range 0 to 9;

1.4 数据类型转换

VHDL为强定义类型语言,不同类型的数据不能进行运算和直接赋值。

  • 类型标记法
代码语言:javascript复制
Variable A: integer; 
Variable B: real;
A= integer (B); 
B=real (A);
  • 函数法
代码语言:javascript复制
Conv_interger (A);--由std_logic转换为integer型,在std_logic_unsigned包。
  • 常数转换法 / 常量转换法
代码语言:javascript复制
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

0 人点赞