新手入门
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提供的用于描述硬件组件的原语(关键字)。您还可以查看我们提供的示例,以查看一些下一步可以做的示例。