Есть ли приемлемый способ получить счетчик Серого кода в долоте? - PullRequest
2 голосов
/ 28 марта 2020

Я хочу написать счетчики в Chisel3, которые будут использоваться для адресации подразделений. Если счетчик совпадает с каким-либо регистром в подразделении, то подразделение срабатывает, в противном случае это не так.

Я бы предпочел цикл адресов в коде Грея, а не в двоичном. Достаточно легко написать двоичный счетчик в Chisel, но я не вижу положения для счетчика кода Грея.

Я могу написать новый тип, похожий на Uint и Sint, но я не хочу изобретать его, если он уже есть. Тем не менее, я не вижу ничего в кулинарной книге или других документах о коде Грея. Github просто открывает Minecraft-ориентированный репозиторий (потому что он соответствует "долото"). Для VHDL уже есть материал, но я хочу express это в долоте.

Так что я пропустил ресурс, который мог бы предоставить Серая стойка в долоте? В противном случае, является ли создание нового типа, похожего на Uint, разумным способом для продолжения?

Ответы [ 3 ]

1 голос
/ 29 марта 2020

Вы можете взглянуть по этой ссылке программисты искали серый код fifo , похоже, это может быть актуально, но я не знаком с ним иначе.

1 голос
/ 29 марта 2020

Я быстро огляделся и не нашел ничего похожего на то, что вы ищете. Самым близким, что я мог найти, был простой счетчик Грея в чипе ракеты (https://github.com/chipsalliance/rocket-chip/blob/29ce00180f2a69947546d6385a1da86cbc584376/src/main/scala/util/AsyncQueue.scala#L49), но он использует обычный двоичный счетчик и затем просто возвращает UInt в коде Грея. Он также не использует никакой безопасности типа Scala.

Я думаю, что это было бы разумно построить, и если вы хотите, вы можете внести его в https://github.com/freechipsproject/ip-contributions для большей наглядности.

Я думаю, если вы хотите правильный GrayCode тип, было бы разумно создать собственный тип. К сожалению, нет способа расширить Data для Bits -подобного типа (все типы в этой иерархии запечатаны), но вы можете создать пользовательский Bundle, который обернет UInt, а затем реализовать ваш собственный набор операций, например

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 Классы типов много, что является более продвинутым Scala характерная черта. Просто упомяну на случай, если какой-то синтаксис в их взгляде будет чуждым.

0 голосов
/ 08 апреля 2020

Как и в случае с Джеком, я не знаком с математикой, необходимой для фактического увеличения значений в коде Грея, но что-то вроде следующего кода преобразует код Грея в двоичный код, добавляет, а затем преобразовывает его обратно в код Грея. Я не уверен, что приведенный ниже код Ve c () будет работать правильно, но должен прояснить идею.

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
  }
}
...