0

我刚开始使用 Chisel 并编写了一个简单的计数器来闪烁 LED。FPGA板(Lattice iCEstick)有一个反相的复位信号,而不是改变生成的verilog中的极性,我想在Chisel中设置它。

我发现 Module 有一个_resetChisel.Bool 类型的参数,可以将其设置为 false,从而反转复位信号。是其他人使用它的示例。但是,我遇到了一个似乎无法修复的错误。首先,代码:

import Chisel._

class Blink( rstPol: Bool = null ) extends Module( _reset = rstPol ) {
  val io = new Bundle {
    val led = UInt( OUTPUT, 1 )
  }

  val cnt_next = UInt()
  val counter  = Reg( init = UInt( 0, 24 ), next = cnt_next )

  cnt_next := counter + UInt( 1 )

  io.led := counter( 23 )
}

object blinkmain {
  def main( args: Array[ String ] ): Unit = {
    chiselMain( Array( "--backend", "v" ),
      () => Module( new Blink( Bool( false ) ) )
    )
  }
}

我得到的错误是:

[error] Blink.scala:19 < /*??*/ Chisel.Bool(OUTPUT, width=1, connect to 0 inputs: ()) > doesn't have its component,yet. in class blinkmain$$anonfun$main$1$$anonfun$apply$1

如果我不提供Bool( false )参数,那么我不会出错,但我的复位极性当然仍然是正的。

我已经尝试过rstPol: Bool = Bool( false )Module( _reset = Bool( false ) )但在第 3 行遇到了同样的错误。似乎它试图将 Bool 分配给没有宽度的东西,但我不知道这怎么可能。

我检查了我使用的是哪个版本的 Chisel,它是2.2.33. 这是我的 build.sbt 文件,以防它很重要:

scalaVersion := "2.11.7"

libraryDependencies += "edu.berkeley.cs" %% "chisel" $ "latest.version"

scalacOptions ++= Seq("-deprecation", "-feature", "-unchecked", "-language:reflectiveCalls")
4

1 回答 1

0

由于我是 Scala 和 Chisel 的新手,所以我错误地认为_reset参数 ofModuleBool表示是否会生成正复位信号或负复位信号。但是,您可以将Bool INPUT连接到,这与错误消息中提到的OUTPUT不同。_resetBool

这就是我修复它的方式(我确实使用计数器宽度参数对其进行了扩展swidth,但这无关紧要):

import Chisel._

class Blink( swidth: Int, rst: Bool = null ) extends Module( _reset = rst ) {
  val io = new Bundle {
    val led = UInt( OUTPUT, 5 )
  }

  val counter = Reg( init = UInt( 0, width = swidth ) )

  counter := counter + UInt( 1 )

  io.led := counter( swidth - 1, swidth - 5 )
}

class Top extends Module {
  val io = new Bundle {
    val led  = UInt( OUTPUT, 5 )
    val rstn = Bool( INPUT )
  }

  val rst   = Reg( next = Reg( next = !io.rstn ) )
  val blink = Module( new Blink( 27, rst ) )

  blink.io.led <> io.led
}

object BlinkMain {
  def main( args: Array[ String ] ): Unit = {
    chiselMain( Array( "--backend", "v", "--targetDir", "verilog" ),
      () => Module( new Top() )
    )
  }
}

因此,我创建了一个Top实例化 的模块,该模块Blink采用反转的复位输入 ( rstn),将其反转,并将其分配给_reset. 为了更好地衡量,我还rstn通过两个触发器将其与输入时钟信号同步。

于 2016-05-03T13:52:50.597 回答