硬件描述语言VHDL——并行语句

2019-05-25 19:51:03 浏览数 (1)

版权声明:本文为博主原创文章,转载请注明博客地址: https://cloud.tencent.com/developer/article/1433296

并行语句是是硬件描述语言的特殊之处,这也是硬件描述语言不可少的一部分。硬件电路例如:总线,它需要多个输入。这个时候,我们必须并发的给出总线上的数据。软件程序设计语言也有并发,但是在性能要求不是苛刻的情形下,无需使用并发。软件的并发由多线程和多进程来实现。

在VHDL中,并发语句是同时执行的。它们的书写顺序和执行顺序没有关系。在结构体中的并行语句主要有一下几种:

  1. 进程语句;
  2. 并行信号赋值语句;
  3. 并行过程调用语句;
  4. 元件例化语句;
  5. 生成语句;
  6. 块语句。

简单信号赋值语句

代码语言:javascript复制
信号<=表达式;

选择信号赋值语句

代码语言:javascript复制
WITH 选择表达式 SELECT
信号<=表达式1 WHEN 选择值1,
	  表达式2 WHEN 选择值2,
	  ......
	  表达式n WHEN OTHERS;        --最后一行这里是分号。其余行是逗号

WITH——SELECT语句是当“选择表达式”的值等于WHEN后面的选择值时,将WHEN前面的表达式值赋给信号。

  • 选择值必须互斥,不能重复。
  • 该语句不能用于进程(PROCESS)中。
  • 选择信号赋值语句不允许出现范围覆盖不全的情况。

条件信号赋值语句

代码语言:javascript复制
信号<=表达式1 WHEN 赋值条件1 ELSE
	  表达式2 WHEN 赋值条件2 ELSE
	  ......
	  表达式n WHEN 赋值条件n ELSE
	  表达式;		--最后一项可以不跟条件子句,用于表示以上赋值条件都不满足的情形。
  • 条件信号赋值语句允许赋值条件重叠,因为,它赋值条件根据书写顺序来逐项测试。一旦发现某一赋值条件得到满足,即将相应表达式的值赋给信号,并且不在测试后面的赋值条件。也就是说,语句之间有优先级顺序,按照书写的先后顺序从高到低排列优先级。适合实现优先级编码器。

进程语句

进程语句PROCESS是VHDL中最重要的语句之一。它的特点如下:

  • 进程与进程之间是并发,这点和软件程序设计语言是一致的。进程内部是顺序执行的。
  • 进程只有在敏感信号发生变化的时候才会执行。

进程语句的格式如下

代码语言:javascript复制
进程名:]PROCESS[(敏感信号列表)]	--进程名不是必须的
[声明区];			--定义进程内部使用的变量,不能在此处定义信号,信号在ARCHITECTURE中定义
BEGIN
顺序语句;
END PROCESS[进程名];
  • 当敏感信号列表中的任意一个发生变化的时候,PROCESS将被启动。
  • PROCESS内部执行是顺序的
  • 在进程内对同一个信号的多次赋值只有最后一次生效。
  • 在不同进程之中不能对同一信号进行赋值。
  • 在一个进程中不能同时对时钟上升,下降沿都敏感。

进程与时钟

进程是由敏感信号的变化来启动的,因此可将时钟作为进程启动的敏感信号。时钟信号的上升沿和下降沿是我们最常使用的。当时钟信号clk是STD_LOGIC类型的时候,时钟信号在VHDL中的描述方法如下:

代码语言:javascript复制
上升沿描述:clk'EVENT AND clk = '1';
下降沿描述:clk'EVENT AND clk = '0';

除此之外,VHDL语言还预定义了两个函数来描述上升沿和下降沿。

代码语言:javascript复制
上升沿描述:rising_edge(clk);
下降沿描述:falling_edge(clk);

注意下面的错误格式:

代码语言:javascript复制
--错误格式1
PROCESS(clk)
BEGIN
IF rising_edge(clk) THEN		--不能同时对上升沿和下降沿都敏感
......
ELSIF falling_edge(clk) THEN
......
END IF;
END PROCESS;
--错误格式2
PROCESS(clk)
BEGIN
IF rising_edge(clk) THEN
......
ELSE			--不能有ELSE,这相当于除了对上升沿敏感,还对下降沿敏感
......
END IF;
END PROCESS;

0 人点赞