FPGA之道(29)VHDL的串行语句

前言

所谓的串行语句,不过是形式上的串行,映射为硬件电路时仍然为并行的。

VHDL的串行语句

串行语句的执行方式是顺序执行的,一般高级编程语言中的语句执行方式都是顺序执行的,例如C语言,由此可见,顺序执行的语句更容易帮助我们来抽象和表达我们的设计思想,尤其是这样能够使时序逻辑的描述变得容易。所以,虽然FPGA的设计思路都是并行的,architecture中也仅支持并行语句的调用,但是为了方便设计者表达自己的思想,尤其是表达时序逻辑的思路,VHDL中的一些并行语句中的子语句体允许是顺序执行的,例如process。
除此以外,由于我们的代码是需要运行在PC机上的编译器来“读懂”并“翻译”成为数字电路的,而PC机上的运行的程序都是顺序执行的,所以,VHDL也必须支持串行的思路,否则编译器也无法工作。还有,仿真VHDL代码的工作也是在PC机上来执行的,所以VHDL本身也必须支持顺序的执行思路来达到仿真的目的。但是请注意,在VHDL中,串行语句的顺序执行只是一种帮助开发者、编译器、仿真器等理解代码、描述功能的一个辅助“思路”,而代码真正对应的硬件结构肯定是并行的!
到底VHDL里面有哪些串行语句可以供我们使用呢?以process为例描述如下:
process(<sensitive_list>)
begin
<VHDL直接信号赋值语句>;
<VHDL变量赋值语句>;
<VHDL条件语句>;
<VHDL空语句>;
<VHDL循环语句>;
<VHDL等待语句>;
<VHDL过程调用语句>;
end process;

VHDL直接信号赋值语句

直接信号赋值语句,也知道它是可以直接写在architecture中的并行语句,不过直接信号赋值语句具有双重身份,那就是它还可以当做串行语句来使用,例如:
process(a, b)
begin
c <= a and b; – 直接信号赋值语句
end process;

VHDL变量赋值语句

变量的特性就是赋值立即生效,由此也决定了它的执行结果必然跟语句的先后顺序有关,因此,变量赋值语句肯定是串行语句的一种。而变量的声明语句也是不能出现在architecture下的,而只能出现process、function、procedure等语句体的内部,所以变量的赋值语句也必然只能出现在这些语句体的内部。例如:

process(a, b)
	variable c : std_logic;
begin
	c := a and b; -- 变量赋值语句
	d <= c;
end process;

VHDL条件语句

条件语句是一种典型的串行语句。VHDL中共有两种条件语句——if-else和case-when,它们的根本区别是if-else中的各个条件分支是具有优先级的,且分支优先级按照书写顺序从高至低,而case-when语句是没有优先级的。关于它们的具体语法介绍如下:

优先级条件语句

优先级条件语句即if-else语句,它的完全语法如下:

if <expression1> then
		<statements>
elsif <expression2> then
		<statements>
<other elsif branchs>
else
		<statements>
end if;

其中的 elsif和else分支都不是必须的,可以根据具体情况来确定。举例如下:
– 求A、B、C三者中的最大值

if (A >= B and A >= C) then
	max <= A;
elsif (B >= C) then
	max <= B;
else
	max <= C;
end if;

注意,上例中,if、then(elsif、then)之间的条件判断表达式可以省略最外层的括号。
为什么说if-else语句是具有优先级的条件语句呢?需要从两个方面来说:

  • 第一,从语句的功能描述来分析。如果要描述上述求最大值的例子,我们可以这样翻译代码:首先,判断数A是不是大于等于B和C,如果成立,则最大值是A,结束判断;否则说明A不是最大值,那么这时候只需判断数B是不是大于等于C,如果成立,则最大值是B,判断结束;否则,由于之前已经得出A、B两数都不是最大值,那么最大值只能是C了。由此可见,每一个分支的判断都是建立在写在它之前的所有分支的基础上的。
  • 第二,从硬件实现上来说。上述求最大值的例子,对应到门级电路上,肯定是从A到max之间的路径最短,即所经过的逻辑门最少,而从B到max之间的路径次之,从C到max之间的路径最长。关于门级实现可以参考如下示意图:
    在这里插入图片描述
    由此可见,基于优先级条件语句的特点,如果我们知道A、B、C三个数中最大值的概率是B大于C大于A,那么我们应该把对B的判断放在第一个分支,然后C放在第二个分支,而A放在最后一个分支。这样,今后的仿真效率会更高,且对于具体的FPGA实现,也能保证最短路径得到最充分的利用,这样芯片即使工作在比较恶劣的环境下,也能保证故障率达到最低。

无优先级条件语句

无优先级条件语句即是case-when语句,它的完全语法如下:

case (<express
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李锐博恩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值