前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一周掌握 FPGA VHDL Day 1

一周掌握 FPGA VHDL Day 1

作者头像
FPGA技术江湖
发布2020-12-30 14:48:00
1K0
发布2020-12-30 14:48:00
举报
文章被收录于专栏:FPGA技术江湖FPGA技术江湖
大侠好,欢迎来到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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FPGA技术江湖 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档