您的位置 首页 > 数码极客

fpga如何例化调用

VHDL语言是指超高速集成电路硬件描述语言。

VHDL(Very High Speed Integrated Circuit Hardware Description Language)

是一种比较常用的FPGA高级编程语言。

而VHDL程序一般是由以下五部分组成的:

  1. 库(Library)
  2. 包(Package)
  3. 实体(Entity)
  4. 结构体(Architecture)
  5. 配置(Configuration)

其中,实体和结构体两大部分组成程序设计的最基本单元。

实体与结构体关系

实体比较简单,只是定义了输入输出端口,与相应的FPGA芯片引脚对对应,也相当于提供一个与外部环境动态交互的通道。

而结构体(Architecture)则比较复杂,要是把实体比作一个黑盒子的话,则结构体可以理解为黑盒子的内部构造。

实体

结构体具体指明了相对应的设计实体的行为,定义了实体的逻辑功能和行为,规定了内部模块与模块之间的连接关系。

结构体定义格式如下:

Architecture 结构体名 of 实体名 is 声明语句(声明结构体中用到的信号、数据等) Begin 功能描述语句(5种语句结构) End Architecture 结构体名

结构体构成图如下图所示,结构体的功能描述语句主要有5种结构组成,在实际应用中不是每一种都要用到,只是根据需要选择相应的语句结构即可。

结构体的组成

结构体的描述方法

结构体描述有下面三种方法:

  1. Structure(结构)描述:描述设计单元的硬件结构,即该硬件是如何构成的,类似于数字电路中的逻辑图描述。
  2. Date Flow(数据流):类似于寄存器传输级的方式描述数据的传输和变换,以规定设计中的各个寄存器形式为特征,然后在寄存器之间插入组合逻辑。
  3. 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 rt1

process后面括号内的(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编程。

感谢您的阅读,相关问题请留言讨论。

责任编辑: 鲁达

1.内容基于多重复合算法人工智能语言模型创作,旨在以深度学习研究为目的传播信息知识,内容观点与本网站无关,反馈举报请
2.仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证;
3.本站属于非营利性站点无毒无广告,请读者放心使用!

“fpga如何例化调用,fpga实例化和调用”边界阅读