首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Chisel中有没有一种公认的方法来获得Gray Code计数器?

在Chisel中有没有一种公认的方法来获得Gray Code计数器?
EN

Stack Overflow用户
提问于 2020-03-28 23:55:17
回答 4查看 175关注 0票数 2

我正在寻找在Chisel3中编写计数器,将用于寻址子单元。如果计数器与某个子单元中的某个寄存器匹配,则该子单元将触发,否则不会触发。

我更希望地址循环使用格雷码,而不是二进制。用Chisel编写一个二进制计数器是很容易的,但是我没有看到提供一个格雷码计数器。

我可以编写类似于Uint和Sint的新类型,但如果它已经存在,我不愿意重新发明它。然而,我在食谱或其他文档中没有看到任何关于Gray code的内容。Github只是出现了一个面向Minecraft的repo (因为它与“Chisel”匹配) VHDL已经存在,但我想用Chisel来表达这一点。

那么,我是否错过了在Chisel中提供Gray计数器的资源?如果做不到这一点,构建一个类似于Uint的新类型是一种合理的继续进行的方式吗?

EN

回答 4

Stack Overflow用户

发布于 2020-03-29 05:59:23

我快速地环顾了一下,没有找到任何和你要找的东西很像的东西。我能找到的最接近的东西是火箭芯片(https://github.com/chipsalliance/rocket-chip/blob/29ce00180f2a69947546d6385a1da86cbc584376/src/main/scala/util/AsyncQueue.scala#L49)中的一个简单的格雷计数器(https://github.com/chipsalliance/rocket-chip/blob/29ce00180f2a69947546d6385a1da86cbc584376/src/main/scala/util/AsyncQueue.scala#L49),但它使用常规的二进制计数,然后返回一个格雷代码形式的UInt。它也没有利用任何Scala类型安全性。

我认为这将是一个合理的构建,如果你愿意,你可以把它贡献给https://github.com/freechipsproject/ip-contributions,以提高可见性。

我认为如果你想要一个合适的GrayCode类型,创建一个自定义类型是合理的。不幸的是,没有办法为Bits-like类型扩展Data (该层次结构中的所有类型都是密封的),但是您可以创建一个包装UInt的自定义Bundle,然后实现您自己的一组操作,例如。

代码语言:javascript
复制
class GrayCode(private val w: Int) extends Bundle {
  val value = UInt(w.W)

  def +(that: GrayCode): GrayCode = ???
}
object GrayCode {
  // Lets you write GrayCode(4.W)
  // Width is defined in chisel3.internal.firrtl though which is awkward...
  def apply(width: Width): GrayCode = ???
}

这只是一个简单的草图。DSP工具库提供了用于DSP的自定义类型的示例:https://github.com/ucb-bar/dsptools

他们倾向于大量使用Scala Typeclasses,这是一个更高级的Scala特性。只是提一下,以防它们中的一些语法看起来很陌生。

票数 1
EN

Stack Overflow用户

发布于 2020-03-29 08:49:48

你可能会看一下这个链接,programmersought gray code fifo,它看起来可能是相关的,但我并不熟悉它。

票数 1
EN

Stack Overflow用户

发布于 2020-04-08 21:58:53

与Jack一样,我不熟悉在Gray代码中实际递增数值所需的数学运算,但类似以下代码的代码会将Gray代码转换为二进制,然后将其相加,然后再转换回Gray代码。我不确定下面的Vec()代码是否可以正常工作,但应该可以清楚地说明这一点。

代码语言:javascript
复制
import chisel3._
import chisel3.util._

class GrayCode(private val w: Int) extends Bundle {
  val value = UInt(w.W)

  def bin2grey(x : UInt) : UInt = {
    x ^ (x >> 1.U)
  }
  def grey2bin(x : UInt, n : Int) : UInt = {
    val tmp = Wire(Vec(n, Bool()))
    tmp(n-1) := x(n-1)
    for (i <- 0 to (n-2)) {
      tmp(i) := x(i) ^ tmp(i+1)
    }
    Cat(tmp.reverse)
  }
  def +(that: GrayCode): GrayCode = {
    val sum = new GrayCode(w)
    sum.value := grey2bin(bin2grey(this.value) + bin2grey(that.value), w)
    sum
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60903080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档