本文作为SpinalHDL学习笔记第二十七篇,介绍SpinalHDL自动设计工具。
目录:
1.QSysify
2.QuartusFlow
1.QSysify
QSysify 是一个能够通过分析 SpinalHDL 组件的 IO 定义来生成 QSys IP(tcl 脚本)的工具。目前它实现了以下接口特性:
• 主/从 AvalonMM
• 主/从 APB3
• 时钟域输入
• 复位输出
• 中断输入
• 导线(作为最后手段使用)
示例
以 UART 控制器为例:
case class AvalonMMUartCtrl(...) extends Component {
val io = new Bundle {
val bus = slave(AvalonMM(AvalonMMUartCtrl.getAvalonMMConfig))
val uart = master(Uart())
}
//...
}
下面的 main 将生成 Verilog 和 QSys TCL 脚本,其中 io.bus 将作为 AvalonMM 总线, io.uart 作为导线:
object AvalonMMUartCtrl {
def main(args: Array[String]) {
//Generate the Verilog
val toplevel = SpinalVerilog(AvalonMMUartCtrl(UartCtrlMemoryMappedConfig(...))).toplevel
//Add some tags to the avalon bus to specify it's clock domain (information used by QSysify)
toplevel.io.bus addTag(ClockDomainTag(toplevel.clockDomain))
//Generate the QSys IP (tcl script)
QSysify(toplevel)
}
}
标签
由于 QSys 需要一些 SpinalHDL 硬件规范中未指定的信息,因此应在接口中添加一些标签:
AvalonMM / APB3
io.bus addTag(ClockDomainTag(busClockDomain))
中断输入
io.interrupt addTag(InterruptReceiverTag(relatedMemoryInterfacei,interruptClockDomain))
复位输出
io.resetOutput addTag(ResetEmitterTag(resetOutputClockDomain))
2.QuartusFlow
编译流是 Altera 定义的命令序列,这些命令使用命令行可执行文件的组合。完整的编译流会按顺序启动所有的编译器模块,进行综合、拟合、最终时序分析,并生成设备编程文件。此文件 中的工具会帮助消除冗余的 Quartus GUI。对于单个 rtl 文件对象 spinal.lib.eda.altera.QuartusFlow 可以自动报告单个 rtl 文件的使用面积和最大频率。
示例
val report = QuartusFlow(
quartusPath="/eda/intelFPGA_lite/17.0/quartus/bin/",
workspacePath="/home/spinalvm/tmp",
toplevelPath="TopLevel.vhd",
family="Cyclone V",
device="5CSEMA5F31C6",
frequencyTarget = 1 MHz
)
println(report)
上面的代码将使用 TopLevel.vhd 创建一个新的 Quartus 项目。
警告: 此操作将删除文件夹 workspacePath !
注解: family 和 device 值作为参数直接传递到 Quartus CLI。请检查 Quartus 文档以确定在您的项目中使用的正确值。
小贴士
为了测试具有太多引脚的组件,请将它们设置为 VIRTUAL_PIN
val miaou: Vec[Flow[Bool]] = Vec(master(Flow(Bool())), 666)
miaou.addAttribute("altera_attribute", "-name VIRTUAL_PIN ON")
对于一个现有项目
类 spinal.lib.eda.altera.QuartusProject 可以自动查找现有项目中的配置文件。它们用于对设备进行编译和编程。
示例
指定包含项目文件的路径,例如 .qpf 和 .cdf 。
val prj = new QuartusProject(
quartusPath = "F:/intelFPGA_lite/20.1/quartus/bin64/",
workspacePath = "G:/"
)
prj.compile()
prj.program() // automatically find Chain Description File of the project
重要: 请记住在调用 prj.program() 之前保存项目的 .cdf 文件。