并行语句是硬件描述语言的一大特点,与像c语言不同的是,并行语句的执行是并行的,不会因为书写顺序的前后而产生执行时的先后。VHDL语言支持的并行语句主要有以下7种:
- 端口映射语句
- 信号赋值语句
- when条件选择语句
- generate语句
- 进程语句
- 过程调用语句
- 块语句
并行语句在VHDL程序中的位置
并行语句可以是结构体的begin与end之间的任何位置,举例如下:
architecture <arch_name> of <entity_name> is
-- Declarations (optional)结构体声明部分
begin
-- Process Statement (optional)
-- Concurrent Procedure Call (optional)
-- Concurrent Signal Assignment (optional)
-- Conditional Signal Assignment (optional)
-- Selected Signal Assignment (optional)
-- Component Instantiation Statement (optional)
-- Generate Statement (optional)
并行语句;
并行语句;
。。。
并行语句
end <arch_name>;
一、映射语句
1、映射语句
映射语句主要应用于模块的调用,在例化模块时用于传递类属性参数和端口连接。
2、component格式
声明被引用模块的接口信息,以便调用该模块时正确进行端口与类属性参数的连接。QuartusII声明格式如下:
3、模块的例化
在VHDL程序中用在结构体声明中声明的模块,模块例化一次产生一块硬件电路,例化两个就产生两块硬件电路。quartusII模块例化格式如下:
architecture <arch_name> of <entity_name> is
-- Declarations (optional)
begin
-- Process Statement (optional)
-- Concurrent Procedure Call (optional)
-- Concurrent Signal Assignment (optional)
-- Conditional Signal Assignment (optional)
-- Selected Signal Assignment (optional)
-- Component Instantiation Statement (optional)
-- Generate Statement (optional)
end <arch_name>;
二、赋值语句
1、并行赋值语句
并行赋值语句是最简单的并行语句,基本格式如下:
信号<=表达式;
并行赋值语句由4部分组成:左操作数、赋值操作符“<=”、表达式和“;”。左操作数不能是输入端口信号,表达式中不能含有输出端口信号。
三、进程语句
1、process语句
进程本身是并行语句,多个process语句并行执行,但它却是由顺序语句组成的。它可以组成组合电路,也可以组合成时序电路。基本格式如下:
[标号:]process(敏感信号列表)
声明语句;
begin
顺序语句1;
顺序语句2;
顺序语句3;
…
end process;
其中标号是可选的,敏感信号列表至少需要一个敏感信号。敏感信号的变化决定进程受否执行,如果敏感信号列表没有信号,那么进程永远挂起不执行;如果进程敏感信号列表没有信号,则需要使用wait语句来代表敏感信号列表的功能。
2、敏感信号列表
如果进程是实现组合逻辑功能,则赋值操作符右边的信号就应该都列入敏感信号列表;
如果进程是实现时序逻辑功能且没有一个异步信号,则需要把时钟信号列入敏感信号列表即可;
如果进程实现时序逻辑功能但与异步信号,则需要把时钟信号与异步信号列入敏感信号列表。
进程的声明语句可以为进程定义一些变量供进程内部使用,举例如下:
process(clk)
--进程内部声明变量的位置
variable temp:integer range 0 to 127:=0;
begin
if clk'event and ckl='1' then
temp:=temp+1;\
dout<=temp;
end if;
end process;
四、条件选择语句
条件选择作用是根据指定的条件表达式,根据多种可能性进行相应的赋值。条件选择语句有when/else与with/select/when两种形式。
1、when/else 条件选择语句
基本格式如下:
信号<=表达式1 when 条件1 else
表达式2 when 条件2 else
…
表达式n when 条件n else
表达式n+1;
2、with/select/when条件选中语句
with/select/when语句与when/select语句类似,根据分支条件选中相应的表达式对目标信号进行赋值,但也有不同,首先with/select/when语句的分支不能有重复,必须唯一。格式如下:
信号<=表达式1 when 条件1 ,
表达式2 when 条件2 ,
…
表达式n when 条件n ,
表达式n+1 when others;
3、条件选择语句的替换
条件选择语句是并行语句,但它却可以由顺序语句来替换。用进程中的if语句来替换when/else语句,用进程中的case语句来替换with/select/when语句。
when/else语句如下:
信号<=表达式1 when 条件1 else
表达式2 when 条件2 else
…
表达式n when 条件n else
表达式n+1;
if语句来替换
process(条件项与表达式中的敏感信号)
begin
if 条件1 then
信号<=表达式1;
elsif 条件2 then
信号<=表达式2;
…
elsif 条件n then
信号<=表达式n;
else
信号<=表达式n+1;
end if;
end process
with/select/when基本格式如下;
with 信号选择判断量select
信号<=表达式1 when 条件1,
表达式2 when 条件2,
…
表达式n when 条件n,
表达式n+1 when others;
可由case语句来替换,替换如下:
process(信号选择判断量、条件项与表达式的敏感信号表)
begin
case 信号选择判断量 is
when 条件1 =>
信号<=表达式1;
when 条件1 =>
信号<=表达式1;
…
when others=>
信号<=表达式n+1;
end case;
end process;
五、generate生成语句
1、for/generate生成语句
for/generate语句在for的范围内执行generate操作,格式如下:
标号:for循环变量in循环变量的范围generate
声明语句;
begin
并行语句;
end generate;
2、if/generate生成语句
if/generate生成语句是在if条件为真的情况下才执行generate操作,格式如下:
标号:if判断条件generate
声明语句;
begin
并行语句;
end generate 标号;
六、procedure语句
过程procedure是VHDL两种子程序(过程与函数)之一,可当作并行语句使用,出现在结构体中。过程procedure语句由两部分组成:过程头与过程体,定义格式如下:
procedure 过程名 参数表 is
[说明部分]
begin
顺序语句
end procedure 过程名
参数表是过程的对外接口,可以是信号、变量与常量。说明部分可以为过程声明变量。begin到end procedure之间是过程功能的实现部分,用顺序语句来描述。调用过程子程序时,当参数表输入信号发生变化时即执行过程中的顺序语句。
七、块语句
块语句由两行或两行以上的并行语句组成的;一般这种并行语句有一定内在联系,可能是共同组成一个逻辑功能。块语句有两种基本形式:简单块语句和保护块语句。
1、简单块语句
基本格式如下:
标号:block
块说明语句;
begin
并行语句;
end block标号;
块说明语句可以是信号的声明、类属性的声明或是不需要任何的块说明语句。
2、保护块语句
格式如下:
标号:block(保护表达式)
块说明语句;
begin
并行语句;
end block标号;
保护块说明语句与简单块说明语句意义相同,保护表达式的意义在于如果保护表达式为真,则执行下面的块语句;如果为假,则不执行下面的块语句。
八、程序包
程序包是VHDL程序的共享部分,在程序包内定义的数据对象与子程序在引用该程序包的VHDL程序中是可见的,因此程序包是VHDL设计能够复用的一个具体表现。程序包可声明的数据对象与子程序如下:
-类型的声明
- 常量的声明
- 文件的声明
- 别名的声明
- 元件的component声明
- 函数的定义
- 过程的定义
程序的使用分为3个过程:程序包的声明、程序包体的定义及使用use语句对程序包的引用。
程序包声明格式如下:
package 程序包名 is
声明语句1;
声明语句2;
声明语句3;
…
声明语句n;
end 程序包名;
程序包体的基本格式如下:
package body 程序包名 is
函数或过程的定义;
end 程序包;