Let’s imagine a component that converts an RGB color into a gray one, and then writes it into external memory.

io name Direction Description
clear in Clear all internal registers
r,g,b in Color inputs
wr out Memory write
address out Memory address, incrementing each cycle
data out Memory data, gray level
  class RgbToGray extends Component{
    val io = new Bundle{
      val clear = in Bool
      val r,g,b = in UInt(8 bits)

      val wr = out Bool
      val address = out UInt(16 bits)
      val data = out UInt(8 bits)
    }

    def coef(value : UInt,by : Float) : UInt = (value * U((255*by).toInt,8 bits) >> 8)
    val gray = RegNext(
      coef(io.r,0.3f) +
      coef(io.g,0.4f) +
      coef(io.b,0.3f)
    )

    val address = CounterFreeRun(stateCount = 1 << 16)
    io.address := address
    io.wr := True
    io.data := gray

    when(io.clear){
      gray := 0
      address.clear()
      io.wr := False
    }
  }

Tags: