0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

SpinalHDL BlackBox时钟与复位

FPGA开源工坊 来源:FPGA开源工坊 2023-05-04 11:13 次阅读

在SpinalHDL中使用之前已有的Verilog等代码的时候需要将这些代码包在一个BlackBox里面,但是如果这些代码里面有时钟和复位,我们需要怎么将时钟和复位端口和SpinalHDL中已有的时钟域连接起来呢?

当BlackBox中只有一个时钟的时候可以直接使用mapClockDomain完成时钟信号和复位信号的赋值。在mapClockDomain中如果没有指定时钟域的话就采用的是默认时钟域。

import spinal.core._
import spinal.lib._
class BK extends BlackBox{
    val clka = in Bool()
    val rsta = in Bool()
    val din = in Bool()
    val dout = out Bool()
    mapClockDomain(clock = clka, reset = rsta)
}
class TestBlackBox extends Component {
    val din = in Bool()
    val dout = out Bool()
    val bk = new BK
    bk.din <> din
    bk.dout <> dout
}
object TestBlackBox extends App{
    SpinalVerilog(new TestBlackBox)
}



5ce9429e-e75c-11ed-ab56-dac502259ad0.png

当有两个时钟域的时候,就需要把时钟域给指定一下了,在下面代码中将时钟域通过参数的方式传了进来。

import spinal.core._
import spinal.lib._
class BK(clockDomaina: ClockDomain, clockDomainb: ClockDomain) extends BlackBox{
    val clka = in Bool()
    val rsta = in Bool()
    val clkb = in Bool()
    val rstb = in Bool()
    val din = in Bool()
    val dout = out Bool()
    mapClockDomain(clockDomaina,clock = clka, reset = rsta)
    mapClockDomain(clockDomainb,clock = clkb, reset = rstb)
}
class TestBlackBox extends Component {
    val din = in Bool()
    val dout = out Bool()
    val clkb = in Bool()
    val resetb = in Bool()
    val clockDomainb = ClockDomain(clock = clkb,reset = resetb)
    val bk = new BK(this.clockDomain,clockDomainb)//默认时钟域和新建的时钟域b
    bk.din <> din
    bk.dout <> dout
}
object TestBlackBox extends App{
    SpinalVerilog(new TestBlackBox)
}

5d06724c-e75c-11ed-ab56-dac502259ad0.png

因为在SpinalHDL中默认时钟域是高复位的,但是我们已有的IP可能是低复位的,这个时候就需要在mapClockDomain中指定一下复位信号是HIGH还是LOW。在下面代码中就将时钟域b下面的复位指定为低复位。

import spinal.core._
import spinal.lib._
class BK(clockDomaina: ClockDomain, clockDomainb: ClockDomain) extends BlackBox{
    val clka = in Bool()
    val rsta = in Bool()
    val clkb = in Bool()
    val rstb = in Bool()
    val din = in Bool()
    val dout = out Bool()
    mapClockDomain(clockDomaina,clock = clka, reset = rsta)
    mapClockDomain(clockDomainb,clock = clkb, reset = rstb, resetActiveLevel = LOW)
}
class TestBlackBox extends Component {
    val din = in Bool()
    val dout = out Bool()
    val clkb = in Bool()
    val resetb = in Bool()
    val clockDomainb = ClockDomain(clock = clkb,reset = resetb)
    val bk = new BK(this.clockDomain,clockDomainb)
    bk.din <> din
    bk.dout <> dout
}
object TestBlackBox extends App{
    SpinalVerilog(new TestBlackBox)
}

5d195d58-e75c-11ed-ab56-dac502259ad0.png

以上三种情况应该足够应对一般情况下BlackBox的时钟域的赋值了。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Verilog
    +关注

    关注

    28

    文章

    1327

    浏览量

    109309
  • 时钟
    +关注

    关注

    10

    文章

    1480

    浏览量

    130306
  • HDL
    HDL
    +关注

    关注

    8

    文章

    323

    浏览量

    47104
  • 复位
    +关注

    关注

    0

    文章

    159

    浏览量

    24047
  • 时钟信号
    +关注

    关注

    4

    文章

    374

    浏览量

    28065

原文标题:SpinalHDL BlackBox时钟与复位

文章出处:【微信号:FPGA开源工坊,微信公众号:FPGA开源工坊】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    SpinalHDL里实现优雅的添加待跟踪波形信号

    波形跟踪信号。在SpinalHDL里,我们可以借助blackBox及scala语言本身实现在SpinalHDL环境里实现对ILA的集成。上面的代码实现了用于添加ILa单元实现波形追踪的代码,在调用
    发表于 06-22 14:37

    SpinalHDL的设计中集成现有RTL设计(IP)的渠道——BlackBox

    在集成IP时需显示映射IP的时钟复位信号,SpinalHDL提供了mapClockDomain、mapCurrentClockDomain两个函数用于时钟映射,mapClockDom
    发表于 06-22 14:59

    关于SpinalHDL仿真中信号驱动那点事儿

    时钟信号从低电平到高电平变化完成之后才推出。那么我们在随后对dataIn的赋值其实是发生在clk上升沿到来后的0+时间才发生的。 从这里代码分析我们可以看出,在SpinalHDL的仿真里:复位信号会
    发表于 06-24 16:34

    聊一聊SpinalHDL 1.6.1引入的blackbox inline功能

    BlackBox在之前的文章中,曾介绍过如何封装兼容别人的RTL代码:SpinalHDL——集成你的RTL代码整体的思路还是简洁明了的,相信读完后照着做很快就能上手。这对于保持设计的兼容性及混合
    发表于 06-29 16:02

    谈谈SpinalHDL中StreamCCByToggle组件设计不足的地方

      模块设计很巧妙,从原理分析的角度来讲挺完美的。但是,百密一疏,这个模块在设计时,对于两侧时钟复位信号的处理,作者并未有妥善的考虑。  现象分析  先来看下面这个example和其测试代码
    发表于 06-30 15:11

    如何在SpinalHDL里启动一个仿真

    withConfig(config: SpinalConfig)函数进行配置。这里的配置常用的是对时钟域的配置,包含时钟有效边沿、复位信号类型、时钟频率等。如下例所示:而DUT的编译则
    发表于 07-26 16:59

    记录一个在使用BlackBox中parameter踩到的坑

    SpinalHDL doc里面也曾提到,在创建BlackBox时,关于原始RTL代码中的parameter的处理方式为:嗯,看起来很简单,我们照猫画虎就好了,最近在写代码时偶然间踩到了一个坑,这里用下面的代码来说
    发表于 08-31 14:58

    SpinalHDL设计错误总结相关资料分享

    设计。以下是SpinalHDL检查的简要概括:  重复赋值  时钟域交叉  层次化违例  组合逻辑环路  Latch  未驱动的信号  位宽不匹配  得不到的switch生命  在每个SpinalHDL
    发表于 10-24 15:37

    SpinalHDL时钟域中的定制与命名

    聊一聊在SpinalHDL时钟域中时钟的定制与命名。 相较于Verilog,在SpinalHDL里,其对时钟域有着更细致的描述,从而也能够
    的头像 发表于 03-22 10:14 1888次阅读

    STM32电源管理、复位时钟

    第二篇文章——STM32电源、复位时钟电源管理电源电压调节器可编程电压监测器(PVD: Programmable voltage detector )低功耗模式复位Cortex-M3的复位
    发表于 01-05 14:25 10次下载
    STM32电源管理、<b class='flag-5'>复位</b>、<b class='flag-5'>时钟</b>

    SpinalHDL中的对应关系及声明形式

    针对SpinalHDL中的两大类型Reg、Wire,来梳理下在SpinalHDL中的对应关系及声明形式。
    的头像 发表于 07-03 11:02 1153次阅读

    SpinalHDL里用于跨时钟域处理的一些手段方法

    每一个做数字逻辑的都绕不开跨时钟域处理,谈一谈SpinalHDL里用于跨时钟域处理的一些手段方法。
    的头像 发表于 07-11 10:51 1382次阅读

    原来SpinalHDLBlackBox封装数组接口如此简单

    当在SpinalHDL中调用别人的RTL代码时,需要采用BlackBox进行封装。对于大多数场景,想必小伙伴们都已轻车熟路。今天着重来看下当RTL代码的接口中存在数组形式的接口时如何处理。
    的头像 发表于 05-22 10:04 447次阅读
    原来<b class='flag-5'>SpinalHDL</b>中<b class='flag-5'>BlackBox</b>封装数组接口如此简单

    STM32失能时钟复位外设的区别

    STM32失能时钟复位外设的区别
    的头像 发表于 10-17 11:48 560次阅读
    STM32失能<b class='flag-5'>时钟</b>和<b class='flag-5'>复位</b>外设的区别

    浅析SpinalHDL中Pipeline中的复位定制

    之前有系列文章介绍了SpinalHDL中Pipeline的使用,最近在一个功能模块中真实的使用了这个lib。
    的头像 发表于 03-17 17:31 561次阅读
    浅析<b class='flag-5'>SpinalHDL</b>中Pipeline中的<b class='flag-5'>复位</b>定制