如何使用chisel3黑盒实现Xilinx差分时钟缓冲器?

时间:2016-12-20 11:13:46

标签: scala xilinx chisel

我想在我的AC701 kit(artix7)上写一个简单的chisel3闪烁LED设计。但要做到这一点,我必须实例化一个时钟输入差分缓冲区。 Xilinx提供以下verilog模板:

IBUFDS #(
    .DIFF_TERM("TRUE"),
    .IOSTANDARD("DEFAULT")
) IBUFDS1_inst (
    .O(clock1), // Clock buffer
    .I(clock1_p), // Diff_p clock
    .IB(clock1_n) // Diff_n clock
);

我在chisel documentation上读到我必须使用«blackbox»类来实例化它。但我不能这样做。 我试过这个:

class IbufdsParam extends VerilogParameters {
    val DIFF_TERM  = "TRUE" 
    val IOSTANDARD = "DEFAULT"
}

class IBUFDS extends BlackBox {
  val params = new IbufdsParam()
  val io = IO(new Bundle {
    val O = Output(Bool())
    val I = Input(Bool())
    val IB = Input(Bool())})
  io.O.setName("O")
  io.I.setName("I")
  io.IB.setName("IB")

  /* For simulation */
  io.O := io.I & ~io.IB
}

但似乎chisel3不知道VerilogParameters类:

[error] blinking_led/blink.scala:5: not found: type VerilogParameters
[error] class IbufdsParam extends VerilogParameters {

我不知道如何说“不要使用时钟并使用此模块重置”。

一旦黑盒正确声明,我将必须将输出时钟('O')连接到闪烁模块的主时钟。我不知道该怎么做。我正在考虑这个问题:

class Blink extends Module {
  val io = IO(new Bundle {
    val clock_p = Input(Bool())
    val clock_n = Input(Bool())
    val led  = Output(Bool())
  })

  val ibufds = IBUFDS()

  Driver.implicitClock := ibufds.io.O
  ibufds.io.I := io.clock_p
  ibufds.io.IB:= io.clock_n

...
}

但我认为这可能不是正确的方式,不是吗?

1 个答案:

答案 0 :(得分:3)

这是文档失败,我很快就会在chisel3 wiki上为参数化的黑盒子添加一个页面。参数化黑盒目前是Chisel3的任何实验性功能,可以通过将字符串映射传递给字符串或Ints或Longs到BlackBox构造函数来使用。因此,对于您的特定情况,请尝试:

import chisel3._
import chisel3.experimental._

class IBUFDS extends BlackBox(Map("DIFF_TERM" -> "TRUE",
                                  "IOSTANDARD" -> "DEFAULT")) {
  val io = IO(new Bundle {
    val O = Output(Clock())
    val I = Input(Clock())
    val IB = Input(Clock())
  })
}

在chisel3中,BlackBoxes没有隐式时钟或重置,端口也无法重命名,而是获取io Bundle中给出的名称(不添加任何io_)。目前还不支持模拟行为,但您可以使用Verilator提供Verilog实现并模拟整个设计。

现在,我们要使用O的{​​{1}}输出并将其连接到某个IBUFDS模块。您不能使用子模块来否决其父模块的时钟,但您可以设置子模块的时钟。因此,我可以提供一些实例化BlinkTop的{​​{1}}模块,例如。

IBUFDS

此代码导致Blink实例化如下:

class Blink extends Module {
  val io = IO(new Bundle {
    val led = Output(Bool())
  })
  val reg = Reg(init = false.B)
  reg := !reg
  io.led := reg
}

class Top extends Module {
  val io = IO(new Bundle {
    val clock_p = Input(Clock())
    val clock_n = Input(Clock())
    val led  = Output(Bool())
  })

  val ibufds = Module(new IBUFDS)
  ibufds.io.I := io.clock_p
  ibufds.io.IB:= io.clock_n

  val blink = Module(new Blink)
  blink.clock := ibufds.io.O
  io.led := blink.io.led   
}

我认为应该做你想做的事!