VHDL的并行语句

并行语句是硬件描述语言的一大特点,与像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 程序包;

上一篇:单文件日志测试


下一篇:Ansible playbook之任务控制