VHDL快速入门一

来源:互联网 发布:淘宝电动车加热手套 编辑:程序博客网 时间:2024/05/23 00:43

VHDL快速入门一

VHDL入门的第一篇,主要关于VHDL最基本的库,程序包,实体和结构体的简单说明。
未来可能会有:
第二篇是关于VHDL的语言要素,例如数据类型、循环这些基本的数据和语句,信号、并发等硬件的内容还有进程等。
第三篇关于逻辑的一些内容。
第四篇是分析一段长代码。
接下来如果继续写的话就是实践的部分了,关于一些硬件的设计。

思路如下:VHDL语言的说明=>一段代码=>VHDL文件的说明=>解释程序中的语句,包括库、程序包、实体和结构体=>重新对之前的代码做解释。

VHDL:Very High speed integrated Hardware Description Language的简称。是IEEE、工业标准硬件描述语言。由于使用了语言的形式描述硬件而非元件连线的图形方式,所以,有易于修改、易于保存的好处。适合用来设计组合复杂的逻辑电路比如译码器,状态机之类的。对于学习VHDL的人而言,VHDL的语法非常接近高级编程语言的语法,如果有编程基础的话,入门比较容易。就算没有编程基础,VHDL语法相比高级编程语言而言相当少,而且语法挺见文知义的,掌握起来并不需要花费很多时间。当然,只是VHDL的简单语法比较容易,硬件设计可不容易。

VHDL
一段代码:
–全加器
–fa.vhd
libary ieee;–库
use ieee.std_logic_1164.all;–程序包

entry fa is–实体
port (a,b,ci: in std_logic;
s,co: out std_logic);
end fa;

architecture b_fa of fa is–结构体
begin
s <= a xor b xor ci;
co <= ((a xor b) and ci) or (a and b);
end b_fa;

VHDL文件的说明

  1. VHDL文件后缀为.vhd。比如上面代码里第二行的fa.vhd就是我给这个代码文件取的文件名。
  2. 每行语句以;英文分号作为结尾。这个和C语言、java这些是一致的。
  3. –两个英语短横线是注释,表示此后的内容不被编译。作用和其他的编程语言一样。
  4. VDHL不区分大小写,也就是说IEEE和ieEe是一样的。
    VHDL的组成
    VHDL代码由五个基本的部分组成,分别是库、程序包、配置、实体和结构体。配置这里先不说,用到的时候再说明。

程序包:

是已经实现了的VHDL文件,用于共享和调用。相当于C语言的头文件,比如必须导入math.h才可以使用数学的一些函数。实际上因为很多数据类型、子程序使用的频率非常的高,这些数据类型和子程序就可以做成程序包,便于调用,减少代码书写量,也可以让设计者专注于自己的设计,一些基本的可以由程序包实现。

程序包的格式是:
USE 库名.程序包名.ALL;

好比上面全加器的代码中使用了这样的一条语句:

use ieee.std_logic_1164.all;–程序包。

表示使用ieee中的std_logic_1164里程序包,其中ieee是库。IEEE是电气和电子工程师协会(Institute of Electrical and Electronics Engineers)的简称,当然,在这里只是指一个库。IEEE制定了很多行业标准,VHDL的标准也是IEEE制定的。感兴趣可以上网查IEEE的相关资料。

常用的程序包有:

  1. STD_LOGIC_1164
  2. STD_LOGIC_ARITH
  3. STD_LOGIC_SIGNED
  4. STD_LOGIC_UNSIGNED

上面的全加器程序就使用了上面的第一个STD_LOGIC_1164。

库很简单,很多程序包的集合就是库了。这也是为什么把库放在程序包后面说的原因。
库的格式:
library 库名;
IEEE、STD和WORK是常用的库。这里没有用到STD和WORK。代码 :libary ieee; 就表示使用ieee库。

实体(entry):

VHDL描述的对象就是实体。是最基本的设计模块。平常说的分配管脚指的就是实体的描述。
实体的格式:

ENTITY 实体名 IS
[GENERIC(类属说明)]
[PORT(端口说明)]
END 实体名;

以上面的全加器代码为例:

entry fa is–实体
port (a,b,ci: in std_logic;
s,co: out std_logic);
end fa;

fa是实体名。没有类属说明。port (a,b,ci: in std_logic; s,co: out std_logic);是端口说明(其实就是平常说的管脚)。注意端口说明语句后的分号,最后一句端口说明的分号在括号后。

实体中的类属:
设计实体的时候指定参数使用。参数包括:端口宽度、实体元件数目、器件延时等。格式如下:

GENERIC (常数名: 数据类型1: = 设定值1;
………
常数名n:数据类型n: = 设定值n);

注意分号的位置。
这里没有使用到类属说明,暂时不说明,等遇到再做说明。

端口:
实体中的输入和输出的说明(管脚)。格式如下:

PORT (端口信号名1: 端口模式1 数据类型1;
……….
端口信号名n: 端口模式n 数据类型n);
注意分号。

端口模式有几种:

  • IN、OUT、INOUT和BUFFER。IN指输入;
  • OUT指输出;
  • INOUT指输入输出双向;BUFFER指缓冲,同时输出和反馈给内部。

数据类型也有几种:

  • integer:整数,用作循环的指针或者常数(查一下词典会发现integer是整数的英文,当然,是十进制的整数);
  • bit:二进制,取值为“1”和”0”;
  • std_logic:逻辑类型,取值有”0”、”1”、”X”(不定,可以是1也可以是0)和“Z”(高阻态,相当于断开);
  • std_logic_vector:std_logic的组合。

格式:data:in std_logic_vector(7 downto 0);
那么data表示连接8根输入端口。

  • 赋值格式:data<= “00000000”,
  • 十六进制:data<= X”00”;X表示十六进制。

这些是全部赋值的,如果想给其中的一个或者几个赋值那么格式如下:

  • data(0)<=’0’;
  • data(6 downto 4)<=”000”;

这里要注意一下给其中一个赋值的时候用的是单引号,多个用的是双引号。和C语言相像,给一个赋值的时候相当于char类型,给多个赋值相当于string类型。
还有一点需要注意的是<=这个符号,它的作用是赋值,但是实际上是实参和形参之间的值传递,从实参传递到形参。赋值和实参形参的值传递有一点小小的区别,赋值会立刻改变参数的值,比如:如果data(0)<=’0’;是赋值的话表示立刻把data(0)的值改为0。而在VHDL中,值传递并不是立刻的,必须等到结束才会修改形参的值。当然,看起来效果是一样的,知道区别就可以了。

再看实体的代码就很明了了:

entry fa is–实体
port (a,b,ci: in std_logic;–表示信号a,b,ci都是使用输入端口,数据类型是std_logic
s,co: out std_logic);–表示信号s,co使用输出端口,数据类型是std_logic
end fa;

结构体(architecture):

结构体是实体内部和实体端口之间的逻辑关系,所以,结构体是实体的具体实现,也是我们逻辑设计的重点部分。以全加器为例,实体声明了输入信号a,b,ci和输出信号s,co,而结构体的作用是从a,b,ci中读取输入,实现全加器的功能,然后输出到s,co中。实体是VHDL描述的对象,而结构体就是描述的这个对象的具体实现。
结构体中有两个部分:
1. 对数据类型、常数、信号、子程序和元件等的说明。
2. 描述实体的逻辑行为。

格式如下:
Architecture 结构体名of 实体名is
–结构体的声明区域:
–声明结构体使用的内部信号和数据类型
–如果使用了元件例化,这里声明使用到的元件
Begin—结构体开始
–并行语句信号赋值:
–进程(使用process关键字)
–元件例化(使用component关键字)
End 结构体名;

以上面全加器的结构体为例:

architecture b_fa of fa is–结构体
begin
s <= a xor b xor ci;
co <= ((a xor b) and ci) or (a and b);
end b_fa;

这里结构体的名称是b_fa,是实体fa中的一个结构体。没有结构体的说明部分,也没有元件例化。开始之后,只有并行语句信号赋值,没有进程,也没有元件例化。并行语句信号赋值是s<=a xor b xor ci;和co<= ((a xor b) and ci) or (a and b);。并行语句的意思是VHDL使用的都是并行的语句。

并行语句:
1. 信号赋值:计算结果并且把结果赋值给信号。比如上面的s<=a xor b xor ci;表示a异或b异或ci,并且把结果传递给s。
2. 子程序调用:调用事先预定好的一个进程或者函数。这里暂时没有出现,以后遇到再说。
3. 元件例化:调用另外一个实体描述的电路,也是调用,但是调用不是数据,不是函数和进程,是元件。这里也没有,遇到再说。
4. 进程:定义算法实现电路功能,执行的顺序是顺序执行。就是

结构体的描述:
1. 行为描述
2. 数据流描述
3. 结构描述
4. 混合描述

这里只简单说明,等碰到再具体说明。
1. 行为描述:从功能和算法方面对结构体进行描述,无需包含任何结构信息,主要以进程形式表示。类似这样的语句:WHEN “00”=>s<=’0’;就是行为描述。
2. 数据流描述方式:类似于布尔方程,既含有逻辑单元的结构信息,又隐含地表示某种行为。这种方式主要采用非结构化的并行语句描述。这里的全加器用的就是数据流描述方式。
3. 结构描述:从设计实体的内部结构对结构体进行描述,给出该实体所包含的模块或元件的互连关系,主要表示为元件例化(引用)的形式。类似这样的语句:G1:and_gate PORT MAP(a,b,co);就是结构描述。
4. 混合描述:把以上几种混合起来,比较灵活。

接下来再对全加器的代码进行整合说明

–全加器
–fa.vhd
libary ieee;–使用ieee库
use ieee.std_logic_1164.all;–使用ieee中std_logic_1164中所有的程序包

entry fa is—定义实体fa
port (a,b,ci: in std_logic;–定义三个使用输入端口,数据类型是std_logic的信号a,b,ci
s,co: out std_logic);–定义两个使用输出端口,数据类型是std_logic的信号s,co
end fa;

architecture b_fa of fa is–定义fa实体的一个结构体b_fa
begin
s <= a xor b xor ci;–并行语句信号赋值,使用了数据流的描述方式,把a xor b xor ci的结果传递到s中
co <= ((a xor b) and ci) or (a and b);–并行语句信号赋值,使用了数据流的描述方式,把((a xor b) and ci) or (a and b)的结果传递到co中
end b_fa;

完。
全文转载请注明出处和作者。

0 0
原创粉丝点击