版权声明:本文为博主原创文章,转载请注明博客地址: https://cloud.tencent.com/developer/article/1433296
并行语句是是硬件描述语言的特殊之处,这也是硬件描述语言不可少的一部分。硬件电路例如:总线,它需要多个输入。这个时候,我们必须并发的给出总线上的数据。软件程序设计语言也有并发,但是在性能要求不是苛刻的情形下,无需使用并发。软件的并发由多线程和多进程来实现。
在VHDL中,并发语句是同时执行的。它们的书写顺序和执行顺序没有关系。在结构体中的并行语句主要有一下几种:
- 进程语句;
- 并行信号赋值语句;
- 并行过程调用语句;
- 元件例化语句;
- 生成语句;
- 块语句。
简单信号赋值语句
代码语言: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;