VHDL语言是指超高速集成电路硬件描述语言。
VHDL(Very High Speed Integrated Circuit Hardware Description Language)
是一种比较常用的FPGA高级编程语言。
而VHDL程序一般是由以下五部分组成的:
- 库(Library)
- 包(Package)
- 实体(Entity)
- 结构体(Architecture)
- 配置(Configuration)
其中,实体和结构体两大部分组成程序设计的最基本单元。
实体与结构体关系
实体比较简单,只是定义了输入输出端口,与相应的FPGA芯片引脚对对应,也相当于提供一个与外部环境动态交互的通道。
而结构体(Architecture)则比较复杂,要是把实体比作一个黑盒子的话,则结构体可以理解为黑盒子的内部构造。
实体
结构体具体指明了相对应的设计实体的行为,定义了实体的逻辑功能和行为,规定了内部模块与模块之间的连接关系。
结构体定义格式如下:
Architecture 结构体名 of 实体名 is 声明语句(声明结构体中用到的信号、数据等) Begin 功能描述语句(5种语句结构) End Architecture 结构体名结构体构成图如下图所示,结构体的功能描述语句主要有5种结构组成,在实际应用中不是每一种都要用到,只是根据需要选择相应的语句结构即可。
结构体的组成
结构体的描述方法
结构体描述有下面三种方法:
- Structure(结构)描述:描述设计单元的硬件结构,即该硬件是如何构成的,类似于数字电路中的逻辑图描述。
- Date Flow(数据流):类似于寄存器传输级的方式描述数据的传输和变换,以规定设计中的各个寄存器形式为特征,然后在寄存器之间插入组合逻辑。
- Behavior process(行为描述):只描述电路的功能或者电路行为,不指明或涉及实现这些行为的硬件结构,与数字电路中的逻辑表达式描述相似。
下面通过使用这三种描述方法,描述同一个二选一选择器,输入为a,b,选择信号为s,输出为y。
1、二选一选择器的Structure(结构)描述:
结构图
例1:VHDL代码如下所示:
architecture one of mux21 is signal d,e:bit; begin d<=a and (not)s; e<=b and s; y<=d or e; end architecture one;2、二选一选择器的Date Flow(数据流)描述:
例2:VHDL代码如下所示:
architecture one of mux21 is begin y<=a when s='0' else b; end architecture one;3、二选一选择器的Behavior Process(行为描述)描述:
例3:VHDL代码如下所示:
architecture one of mux21 is begin y<=(a and (not s) or (b and s); end architecture one下面主要讲解功能描述语句中的五种语句结构的具体用法,以及他们之间的区别。
功能描述的五种语法结构
1、块语句(block):
块语句是将一系列并行描述语句进行组合,目的是改善并行语句及其结构的可读性,可以使结构层次鲜明,结构更加明确。
例4:结构举例VHDL代码如下所示:
a: out1<='1' after 2 ns; blok1: block begin b: out2<='1' after 2 ns; c: out3<='1' after 2 ns; end block blok1上面例4的代码等价于下面例5所示的代码,可以看出,块不影响代码的执行顺序。
例5:VHDL代码如下所示:
a: out1<='1' after 2 ns; b: out2<='1' after 2 ns; c: out3<='1' after 2 ns;2、进程(Process)语句
首先,进程是定义顺序语句的模块,用从外部接收的信号值,或者使用内部的运算数据向其它的信号进行赋值。
注意:一个结构体可以又多个进程,进程之间是并行关系,而进程内部是顺序执行的。
使用例6程序进行说明:还是二选一电路
例6:VHDL代码如下所示:
architecture rt1 of mux21 is begin process(a,b,sel) begin if (sel ='1') then y<=a; else y<=b; end if end process end rt1process后面括号内的(a,b,sel)属于敏感列表,也就是说,只要a,b,sel三个信号,任意一个变化process都会被执行。其实,除了使用敏感列表这种方式,还有一种使用wait on的办法,他们是完全等效的,并且只能二选一,不能同时使用。看下面的例7,与上面例6完全等效。
例7:VHDL代码如下所示:
architecture rt1 of mux21 is begin process begin wait on a,b,sel; if (sel ='1') then y<=a; else y<=b; end if end process end rt1其中用到了wait语句,在以后的文章会专门进行讲解,例程中的wait on是指等待a,b,sel这三个信号中的任何一个发生变化。
3、信号赋值语句
之前文章《FPGA高级语言编程VHDL中数据对象介绍》中关于信号(signal)章节讲的非常清楚了,这里不再过多重复。有需要的可以翻看。
4、子程序调用语句
主要用于调用函数或者过程,并且将结果赋值给信号。这个跟其它语言是一样的,不再介绍。
5、元件例化语句
主要是用来调用另外一个实体所描述的电路,元件例化前需要进行说明,再进行例化,结构如下所示:可以看出元件说明与实体说明的编写方法是一样的。
architecture str of entity_name is component 元件名 is generic 说明 port(端口名: 模式 信号类型; 端口名: 模式 信号类型); end componnet 元件名举例说明,例8为已有电路的实体程序,例9为调用例8实体进行元件说明。
例8:VHDL代码如下所示:
library ieee; use ieee.; entity and2 is port(a,b: in std_logic; y: out std_logic); end entity and2; architecture rtl of and2 is begin y<=a and b; end architecture rtl;例9:VHDL代码如下所示:
component and2 is port(a,b: in std_logic; y: out std_logic); end component and2;元件例化语句书写格式:
元件编号:元件名 port map(信号对应表);
信号对应有两种方法:位置映射和名称映射
位置映射要求按已有元件的各个端口顺序排列连接点,例如:
u1: and2 port map(d0,sel,aa);名称映射对于位置没有要求,要求名称逐一连接即可。例如:
u2: and2 port map(a=>d0,b=>sel,y=>aa);关于元件例化完整的举例实现下图所示功能(X先与Y再取反通过Z输出):
Z=not(X and Y)
VHDL代码如下例9所示,主要通过例化调用例8中定义的实体 and2与取反函数not来实现,首先对两个实体进行了例化说明,然后进行例化调用,实现上图结构的功能。
例9:VHDL代码如下所示:
library ieee; use ieee.; entity knand2 is port(X,Y:in std_logic; Z:out std_logic); end entity knand2 architecture str of knand2 is component and2 is port(a,b: in std_logic; y: out std_logic); end component and2; component not is port(a: in std_logic; b: out std_logic); end component not signal temp: std_logic; begin a1: and2 port map(X,Y,temp); a2: not port map(temp,Z); end architecture str总结
关于VHDL中结构体(Architecture)的讲解到此完结,其实,结构体是VHDL中一个非常重要的概念,只要掌握好它的5种功能描述语句,才能学好VHDL编程。
感谢您的阅读,相关问题请留言讨论。