在C上使用Verilog或VHDL的动机是什么?


12

我来自编程背景,对硬件或固件(最多是电子产品和Arduino)的了解不多。

在像C或某些Assembly这样的编程语言上使用Verilog和VHDL等硬件描述语言(HDL)的动机是什么?

这是一个选择问题吗?

我读到它的固件写在HDL中的硬件在并行运行指令方面具有明显的优势。但是,令我惊讶的是,有讨论使人们怀疑是否要用C或Assembly编写固件(如果您不一定要有CPU,如何使用Assembly?),我感到很惊讶,但我得出结论,这也是一个选择。

因此,我有几个问题(不要犹豫,解释一下):

  1. 固件真的可以用HDL或软件编程语言编写,还是执行相同任务的另一种方式?我喜欢真实的例子。每个选项产生什么约束?

  2. 我知道固件在软件上的普遍用法是在硬件加速器(例如GPU,网络适配器,SSL加速器等)中。据我了解,这种加速并非总是必要的,而只是推荐的(例如,在SSL和复杂算法加速的情况下)。在所有情况下都可以在固件和软件之间进行选择吗?如果不是这样,我很乐意使用固件清晰明确的方式。

  3. 我读过,固件大部分刻录在ROM或闪存上。它在其中如何表示?像软件一样?如果是这样,有什么深远的区别?如果是固件,是否可以使用自适应电路?

我想我在某些假设下到处都是错误,请原谅。谢谢!


14
编程语言用于描述软件,硬件描述语言用于描述硬件。
伊格纳西奥·巴斯克斯

1
您不使用Verilog或VHDL编写固件-您使用Verilog或VHDL设计芯片,对FPGA进行编程并设计主板。您使用C或汇编语言编写固件。您还可以使用C / C ++设计母板-有一个名为SystemC的库,可以通过C编译器进行编译,以创建一个模拟您的设计的程序,也可以通过SystemC编译器将其编译为电路。
slebetman 2014年

FWIW,由于您具有Arduino的经验,因此为Arduino编写软件称为编写固件。固件可以是完整的操作系统-例如,大多数路由器的固件中使用linux,大多数ATM的固件中使用Windows
slebetman 2014年

Answers:


28

在像C或某些Assembly这样的编程语言上使用Verilog和VHDL等硬件描述语言(HDL)的动机是什么?

C和汇编语言是告诉CPU怎么做的好语言。它们描述了单个状态机要顺序执行的动作。

HDL是用于描述或定义数字电路的任意集合的好语言。他们可以以编程语言无法表达的方式来表达并行执行的操作。他们还可以用编程语言无法描述的方式来描述块之间接口的时序限制。

令我惊讶的是,有讨论对使用C还是Assembly编写固件存有疑问(如果您不一定要有CPU,那么Assembly如何合适?)

在这个问题中,所要问的是:“如果您正在为微控制器编写代码,那么用汇编语言或C语言或其他高级语言编写的代码是否有真正的区别?”。

由于他专门询问带有微控制器的系统(带有外围设备的CPU),因此C或汇编语言都是固件开发的合理选择,而HDL则不是。

固件真的可以用HDL或软件编程语言编写,还是执行相同任务的另一种方式?

这取决于您拥有哪种硬件。如果您有CPU,请使用编程语言。如果您具有FPGA或正在设计ASIC,请使用HDL。如果要设计大量的数字逻辑,则可以使用SystemVerilog之类的中间语言。

我读过,固件大部分刻录在ROM或闪存上。它在其中如何表示?像软件一样?如果是这样,有什么深远的区别?如果是固件,是否可以使用自适应电路?

我认为您已经对“固件”一词了如指掌。这个词原本是指要在嵌入式系统上运行的代码,最终用户无法更改该代码。如果您向某人出售了一台PC,则用户很有可能会更改在其上运行的软件。如果您向他们出售示波器,就不希​​望他们更改内部微处理器上运行的代码,因此将其称为固件。

FPGA用户在设计输出中使用了“固件”一词,因为它比硬件(焊接在一起的东西)更易变。但是实际上配置FPGA的“固件”不同于在uC上运行的“固件”。uC固件通过一系列状态指导uC执行其功能。FPGA固件定义了逻辑元素之间的一组互连,以及要存储在查找表中的值。

在这两种情况下,固件通常都以位的形式存储在eeprom中(或存储在主机计算机的磁盘上,只要重新启动嵌入式系统,该磁盘就会将其卸载)。但这并不能使它们彼此相似。


当您用VHDL / Verilog编写代码时,可以很容易地看到将要实现的逻辑并因此得到优化。C不能这么说。即使SystemC与实际的物理实现仍然
相距甚远,以至于

@JonRB,如果您要编写uC或uP,我实际上不知道有什么方法可以使用HDL做到这一点。我同意,当编码逻辑,SystemVerilog或SystemC用于如此之大的系统时,试图在单个门级上设计所有内容是不切实际的。
Photon

2
请注意,当您完全没有硬件时,也会使用VHDL和Verilog。它们可以直接编译为电路而不是FPGA比特流。例如,苹果公司过去使用Verilog而不是GUI原理图捕获来设计其主板,因为当您的设计是纯文本而不是专有的二进制图形时,对版本控制,grepping和仅使用脚本的解析提供了更好的支持。
slebetman 2014年

10

对于问题的第一部分,关于使用一种或另一种的动机:C和HDL(VHDL / Verilog)之间存在根本差异。C是一种软件编程语言(与汇编一样),VHDL / Verilog是硬件描述语言。它们的目的不同。

当C被转换成汇编代码(在其二进制形式,即,机器语言)编译。该代码是一系列指令,告诉CPU执行一系列基本操作(更改寄存器值,执行加法运算等)。

另一方面,HDL被合成为硬件。在VHDL中,您可以例如编写如下内容:

output <= input1 + input2;

(另请参见此处的更完整示例)。这将被合成为(硬件)加法器。如果代码是为FPGA合成的,则意味着可以配置特定FPGA来实现加法器(作为组合逻辑)的比特流。

实际上,您可以在VHDL中设计一个CPU(请参阅软核处理器VS硬核处理器),然后在CHD中为其编写软件。

关于固件:实际上,这完全取决于您如何定义单词。甲固件可以是一个程序(软件),在微控制器运行(因此C语言或汇编书面例如),或者它可以是配置一个可编程的(硬件)逻辑器件(CPLD或FPGA)的比特流。有时它可能是一个包含以下两者的软件包:如果您为某些型号的FritzBox(ADSL调制解调器)购买固件,则它们实际上包含一个完整的Linux系统(用汇编语言,C语言和许多其他编程语言编写)以及一个用于配置FPGA(可能是从VHDL或Verilog合成的)。


3
  1. 这取决于您的体系结构。如果您有CPU(或者通常是微处理器),则需要使用常规编程语言(包括汇编语言)编写固件。如果您有类似FPGA的产品,则需要将固件写入HDL。HDL无法(据我所知)生成可以由常规CPU有效执行的程序,而FPGA则不能立即执行常规程序。但是,您可以将FPGA配置为CPU,然后执行常规程序。这将需要两层固件,用HDL编写的较低层来构建CPU,而用常规编程语言编写的较高层来在该CPU上执行。
  2. 固件和软件之间没有硬性区别。在许多设备上,固件将存储在例如闪存中,但是在现代手机上,几乎所有内容都存储在闪存中,并且固件和软件之间的区别尚不清楚(大多数人可能会考虑对基带处理器固件进行编程的代码) ,大多数人会考虑使用应用程序软件,但是确切的界限在哪里?)。
  3. 正如我在第2篇中所说的,除了固件更加持久的想法外,没有明显的区别。

3

硬件并发是主要动机。

电子可以同时在平行导线中流动,因此我们在设计硬件时要考虑到这一点。

在VHDL中,如果您编写如下内容:

x <= a or b;
y <= a and b;
z <= x xor y;

(在process或之外,将function其明确标记为顺序),那么您已经编码了以下事实:

  • xyzab是金属丝
  • ab是输入信号
  • x连接到or电路的输出,该电路以ab作为输入
  • 以此类推

很容易看到如何将其综合到实际硬件中,并x同时y对其进行评估。

        +-----+
A--+----+     |  X
   |    | OR  +-----+
B----+--+     |     |  +-----+
   | |  +-----+     +--+     |
   | |                 | XOR +-- Z
   | |  +-----+     +--+     |
   | +--+     |  Y  |  +-----+
   |    | AND +-----+
   +----+     |
        +-----+

然后,是时候对电路进行仿真了,模拟器(通常是一个顺序程序)对电路的物理原理进行了如下模拟:

  • ab改变了?是?嘿,x取决于a。让我们更新x
  • y还取决于a。也更新它。
  • z取决于x。更新它,因为x已更新。
  • 是否有任何x依赖于(ab)的更新?没有?与y和相同z。好的,我们完成了这一步。

这会导致“有趣的”可能的结果,这些结果没有顺序的相似性,但代表可能的身体状况:

  • x <= not x将导致模拟的无限递归。模拟器可以在一定深度后切断。
  • x <= 0; x <= 1导致错误(短路)。这是存在的原因之一std_logic

尽管如此,即使VHDL对硬件的建模比对C更为严格,但它本身并不是对它的完美详细描述:

最后,VHDL在较高层次的人类可理解的电路功能与较低层次的可综合性之间取得了很好的平衡。

另一方面,C更专注于顺序地与CPU通讯。

您当然可以用C的结构,枚举和数组对电路进行编码,然后像VHDL一样对它进行仿真(这大致上类似于System C的行为,但我从未尝试过)。

但实际上,您将使用更冗长的语言重新实现VHDL仿真器。我猜正确的工具适合正确的工作。

还有一些工具可以将C转换为VHDL /programming/8988629/can-you-program-fpgas-in-c-like-languages,但是期望性能较低,因为它们是较高级别的转换。


0

HDL用于描述(合成)硬件,其中使用编程语言来编程已合成的硬件(即cpu)。

您可以将cpus的软核版本转换为VHDL或比特流,以在FPGA上合成该cpu。


-1

通过允许大多数组件用于在不同的时间执行不同的操作,处理器使用少量的电路依次执行大量的操作。

FPGA包含许多电路,这些电路不能(至少个别地)执行特别复杂的操作,但都能够同时且独立地起作用。

假设有人想要一种芯片来执行许多任务,其中包括监视15个输入,并且:

  • 只要所有输入稳定至少21ms且将高输入数量设为三的倍数,就将输出设置为高
  • 只要所有输入稳定至少21ms且输出高的数量不是三的倍数,就将输出设为低
  • 在任何输入更改到所有输入稳定至少20ms的时间之间,以任意方式更改输出。

如果一个人的微控制器在做其他事情,但是每20ms可以节省几微秒的时间来检查这些输入并设置输出,那么该微控制器用来执行其他任务的大多数电路也可以用来执行所指示的任务以上,几乎不需要专门的电路(除了一些ROM和RAM)。另一方面,从输入更改到输出正确反映该时间可能需要一段时间。

使用Verilog或VHDL,可以构建硬件电路,该电路可以连续监视15个输入并执行指示的计算。这样的设备可能能够使输出在100ns内产生正确的指示-比微控制器快几个数量级-但专用于该任务且不能用于任何其他目的的电路数量会大得多。


这似乎不是一个特别清晰的例子来说明与之的区别-其细节中有足够的有争议的要点,可能无法真正帮助熟悉尚未熟悉的任何人。实际遇到此问题的人可能会选择具有宽数据字和良好引脚更改中断的现代MCU。然后,要确定哪种解决方案消耗更多的逻辑,就需要确定是计算MCU上大量未使用的外设还是FPGA上未触及的片。前者会便宜很多。
克里斯·斯特拉顿

@ChrisStratton:也许我应该建议,如果时间要求越来越严格,情况可能会改变?要求CPU每20毫秒有几微秒的可用时间可能不需要对基础系统进行任何更改,但是如果响应时间需要为200us,则这种要求可能需要比其他情况需要更快的CPU。在20us以下,可能有必要添加一个额外的CPU来处理它,而在200ns以下,可能根本不可能用CPU来完成。
超级猫

那是因为您没有利用MCU的功能。在引脚更改中断上,启动一个硬件定时器模块,该模块将在20 ms之后设置输出。然后,悠闲地决定是否确实需要这样做,否则请取消。指出FPGA观点并不是一个很好的例子,因为它们之间存在很大的相互依赖性-真正并行运行的唯一部分是事件检测,而现代MCU 已经在很大程度上并行了硬件。同时,其余部分实际上是顺序的,因此您可以构建一个超快状态机,观看非常慢的时钟?
克里斯·斯特拉顿

@ChrisStratton:如果存在合适的引脚变换中断功能并且尚未用于其他用途,则可以避免进行持续轮询,但是如果同时发生许多事情,则需要以任何速率顺序处理它们CPU可以处理它们。
超级猫

考虑到问题陈述在输入和响应之间造成的巨大延迟,因此顺序处理不是问题。即使当前的 MCU太忙,为此添加一个MCU只是添加FPGA成本的一小部分。实际上,在FPGA中解决此问题的唯一方法是要么已经存在带有备用片并将信号路由到其中的信号,要么是在教育或业余爱好背景下的人工项目。
克里斯·斯特拉顿
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.