跳到内容

可编程逻辑/并行执行

来自维基教科书,开放世界中的开放书籍

此页面将讨论并行程序执行,这是在编程 HDL 时最大的问题之一。

内联执行

[编辑 | 编辑源代码]

内联执行是在计算机程序中通常发生的事情。指令按顺序执行,一个指令完成执行后才会执行下一个指令。这不是 HDL 编程的工作方式,尽管我们将在本文中学习的 HDL 允许一些用于顺序操作的功能。尝试强制硬件设计完全顺序通常是极低效的,在这种情况下,通常最好简单地使用微控制器,并在软件而不是硬件中执行您的任务。


连续执行

[编辑 | 编辑源代码]

Verilog、VHDL 甚至 SystemC 都是描述电子电路的方法,作为大型复杂原理图的替代方案。电子硬件通常具有许多同时相互并行运行的组件。

由于这一事实,HDL 中的语句通常被视为并行执行,除非另有说明。这与传统的计算机编程非常不同,对于经验丰富的计算机程序员来说,将其才能转化为 HDL 可能很困难。

问题和陷阱

[编辑 | 编辑源代码]

许多传统的计算机算法依赖于代码按顺序执行这一事实。出于这个原因,许多此类算法无法轻松或肯定地应用于 HDL。

尝试使硬件中的操作顺序不仅是一项艰巨的任务(编程需要更长时间),而且还需要更多硬件资源,例如锁存器、寄存器和定时电路。完全放弃顺序操作也会导致定时和程序复杂性的问题。

与软件的关系

[编辑 | 编辑源代码]

有使用多线程软件经验的程序员可能会很快理解同步并行执行的概念,尽管有一些值得讨论的细节。在软件中,所有指令都被认为是按顺序执行的,一个接一个地按照预定义的顺序执行。并发进程或“线程”的错觉是由于不同的线程快速切换来切换去,以至于看起来是在并行运行。即使在多核处理器中,所有线程也不可能真正并行运行,因为通常计划执行的活动线程数多于同时处理它们的可用核心数。

在硬件中,单独的进程确实同时发生,没有任何错觉。由于多个进程同时发生,并且它们的行动与全局时钟信号同步,因此更容易在进程之间获得正确的计时,并避免竞争条件或死锁。在软件中,任务调度程序可以以任何顺序调度各个线程,或者以任意方式将它们分布在不同的处理核心上(应用程序程序员通常不知道调度程序使用什么算法)。

另一个问题是硬件模块不像软件模块那样动态加载或卸载。这意味着所有要使用的硬件必须一次创建,并且实际上是静态的。运行时无法加载其他模块。一旦芯片生产出来,唯一添加功能的方法是设计并生产一个新芯片,然后将芯片连接在一起。这个概念的另一个方面是硬件模块仍然存在,并且仍然运行,即使程序员没有明确考虑该操作。

考虑一个具有 3 个模块的芯片设计:输入模块、处理模块和输出模块。输入模块从外部总线读取信号,对其进行处理,然后由输出模块将其写回总线。假设信号当前位于处理模块中:那么另外两个模块在同一时间都在做什么?所有模块的操作都需要始终考虑在内,如果某些模块应该在某些时候处于“休眠”状态,则需要添加该功能。

华夏公益教科书