FPGA入门必修课,学习VHDL语言

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.变量赋值

变量赋值一律用:=

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值