SpinalHDL之自动设计工具 (EDA)

本文作为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 文件。

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千穹凌帝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值