SpinalHDL: Getting Start

新手入门

SpinalHDL是一种用Scala编写的硬件描述语言。而Scala是使用一种使用Java虚拟机(JVM)的静态类型的功能语言。为了使用SpinalHDL进行编程,您必须先安装JVM和Scala编译器。如果您还没有这些工具,我们将在下一节中说明如何下载。

环境需求(使用时需要下载的内容)

在下载SpinalHDL工具之前,您需要安装:
– 一个Java JDK,可以从此处下载安装。
– Scala 2.11.X 发行版,可在此处下载。(如果使用SBT构建工具,可不需要此发行版)。
– SBT构建工具,可在此处下载。

可选的:
– 一个IDE(不是强制的),我们建议您使用IntelliJ及其Scala插件。
– Git,用于版本控制。

如何开始使用SpinalHDL编程

下载完所有的需求后,有两种方法可以开始使用SpinalHDL编程。
– SBT方式:如果您已经熟悉SBT构建系统,或者不需要IDE。
– IDE的方式:在IDE中获取已经为您设置好的项目,然后立即开始编程。

SBT 方式

我们在GitHub上准备了一个现成的项目。
下载或者克隆“入门”资源库

在该项目的根目录打开一个终端,然后运行sbt run。首次执行该语句时,可能需要一段时间,因为它将下载运行SpinalHDL所需的所有依赖项。

通常,这条命令会生成一个名为MyTopLevel.vhd的输出文件,该文件对应于src\main\scala\MyCode.scala中定义的顶层SpinalHDL代码。这对应最简单的SpinalHDL的示例

在纯净的Debian发行版中,您可以在shell下输入以下命令。这些命令可以帮助您安装Java, Scala, SBT, 下载上面提到的入门项目,并生成相应的VHDL文件。就不用担心第一次运行它所花费时间了。

sudo apt-get install openjdk-8-jdk
sudo apt-get install scala
echo "deb https://dl.bintray.com/sbt/debian /" | sudo tee -a /etc/apt/sources.list.d/sbt.list
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 642AC823
sudo apt-get update
sudo apt-get install sbt
git clone https://github.com/SpinalHDL/SpinalTemplateSbt.git SpinalTemplateSbt
cd SpinalTemplateSbt
sbt run   # select "mylib.MyTopLevelVhdl" in the menu
ls MyTopLevel.vhd

SBT的离线环境

通常,SBT使用在线的存储库下载缓存您项目的依赖项,此缓存位于home/.ivy2文件夹中。设置离线的SBT环境的方法是从已经完整下载互联网所有内容的环境中复制此换从,拷贝到您所使用的离线环境中。

您可以在此获取可携带的SBT环境:https://www.scala-sbt.org/download.html

IDE方式:使用IntelliJ IDEA及其Scala插件

除了上述的需求之外,还需要下载IntelliJ IDEA(免费的Community社区版就足够了)。安装IntelliJ之后,还请检查是否已经启用了Scala插件(可以在此处找到安装信息)。

然后执行以下操作:
下载或者克隆“入门”资源库
– 在IntelliJ IDEA中,使用“导入项目”并选择这个存储库的根目录。选择从外部SBT模型中选择导入项目,并确定选中了所有的可选框。
– 另外,您可能需要指定一些路径。比如,指定IntelliJ所使用的的JDK安装路径。
– 在项目中(IntelliJ GUI中),右键单击src/main/scala/mylib/MyTopLevel.scala并选择“Run MyTopLevel”。

这应该在项目的目录中生成MyTopLevel.vhd的文件,该文件实现了一个简单的8位计数器。

一个简单的SpinalHDL例子

以下代码在两个1bit的输入之间生成一个“与”门。

import spinal.core._

class AND_Gate extends Component {

  /**
    * This is the component definition that corresponds to
    * the VHDL entity of the component
    */
  val io = new Bundle {
    val a = in Bool
    val b = in Bool
    val c = out Bool
  }

  // Here we define some asynchronous logic
  io.c := io.a & io.b
}

object AND_Gate {
  // Let's go
  def main(args: Array[String]) {
    SpinalVhdl(new AND_Gate)
  }
}

如您所见,您在SpinalHDL文件中编写的第一行必须是import spinal.core._,这表明我们正在文件中使用了SpinalHDL组件。

生成的代码

成功编译后,应生成以下的VHDL代码:

package pkg_enum is
  ...
end pkg_enum;

package pkg_scala2hdl is
  ...
end  pkg_scala2hdl;

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

library work;
use work.pkg_scala2hdl.all;
use work.all;
use work.pkg_enum.all;


entity AND_Gate is
  port(
    io_a : in std_logic;
    io_b : in std_logic;
    io_c : out std_logic
  );
end AND_Gate;

architecture arch of AND_Gate is

begin
  io_c <= (io_a and io_b);
end arch;

接下来应该做什么?

这取决于您,可以看看SpinalHDL中的类型和SpinalHDL提供的用于描述硬件组件的原语(关键字)。您还可以查看我们提供的示例,以查看一些下一步可以做的示例。

You may also like...