Compare commits
3 Commits
7ac56c01af
...
88f1cbe420
Author | SHA1 | Date | |
---|---|---|---|
88f1cbe420 | |||
48d8524c4a | |||
d7b9834d96 |
115
src/main/scala/devices/terminal/Terminal.scala
Normal file
115
src/main/scala/devices/terminal/Terminal.scala
Normal file
@ -0,0 +1,115 @@
|
||||
// See LICENSE for license details.
|
||||
package sifive.blocks.devices.terminal
|
||||
|
||||
import Chisel._
|
||||
import chisel3.core.{Input, Output}
|
||||
import chisel3.experimental.{Analog, MultiIOModule}
|
||||
import freechips.rocketchip.config.{Field, Parameters}
|
||||
import freechips.rocketchip.diplomacy.{LazyModule, LazyModuleImp}
|
||||
import freechips.rocketchip.regmapper._
|
||||
import freechips.rocketchip.subsystem.{BaseSubsystem}
|
||||
import freechips.rocketchip.tilelink._
|
||||
import freechips.rocketchip.util.AsyncQueue
|
||||
import sifive.blocks.util.NonBlockingEnqueue
|
||||
|
||||
case class TerminalParams (
|
||||
address: BigInt
|
||||
)
|
||||
|
||||
class TerminalSysIO extends Bundle {
|
||||
val clk = Input(Clock())
|
||||
val reset = Input(Bool())
|
||||
}
|
||||
|
||||
class TerminalDVIIO extends Bundle {
|
||||
val d = Output(Bits(12.W))
|
||||
val clk_p = Output(Bits(1.W))
|
||||
val clk_n = Output(Bits(1.W))
|
||||
val hsync = Output(Bool())
|
||||
val vsync = Output(Bool())
|
||||
val de = Output(Bool())
|
||||
val reset = Output(Bool())
|
||||
val i2c_scl = Analog(1.W)
|
||||
val i2c_sda = Analog(1.W)
|
||||
}
|
||||
|
||||
class Terminal extends BlackBox {
|
||||
val io = IO(new Bundle {
|
||||
val sys = new TerminalSysIO
|
||||
val dvi = new TerminalDVIIO
|
||||
val write_enable = Input(Bool())
|
||||
val write_data = Input(UInt(8.W))
|
||||
})
|
||||
|
||||
override def desiredName: String = "terminal"
|
||||
}
|
||||
|
||||
trait TerminalRegBundle extends Bundle {
|
||||
val port_sys = new TerminalSysIO
|
||||
val port_dvi = new TerminalDVIIO
|
||||
}
|
||||
|
||||
trait TerminalRegModule extends MultiIOModule with HasRegMap {
|
||||
val params: TerminalParams
|
||||
val io: TerminalRegBundle
|
||||
|
||||
val term = Module(new Terminal)
|
||||
io.port_sys <> term.io.sys
|
||||
io.port_dvi <> term.io.dvi
|
||||
|
||||
val crossing = Module(new AsyncQueue(UInt(8.W), depth=1, safe=false))
|
||||
|
||||
crossing.io.enq_clock := clock
|
||||
crossing.io.enq_reset := Bool(false)
|
||||
crossing.io.deq_clock := io.port_sys.clk
|
||||
crossing.io.deq_reset := Bool(false)
|
||||
|
||||
// wire up dequeue to terminal io
|
||||
term.io.write_enable := crossing.io.deq.valid
|
||||
term.io.write_data := crossing.io.deq.bits
|
||||
crossing.io.deq.ready := Bool(true) // terminal can read at every cycle
|
||||
|
||||
regmap(
|
||||
0 -> NonBlockingEnqueue(crossing.io.enq)
|
||||
)
|
||||
}
|
||||
|
||||
class TLTerminal(w: Int, params: TerminalParams)(implicit p: Parameters)
|
||||
extends TLRegisterRouter (
|
||||
params.address,
|
||||
"terminal",
|
||||
Seq("klemens,terminal0"),
|
||||
beatBytes = w
|
||||
)(
|
||||
new TLRegBundle(params, _) with TerminalRegBundle
|
||||
)(
|
||||
new TLRegModule(params, _, _) with TerminalRegModule
|
||||
)
|
||||
|
||||
//-- TerminalPeriphery
|
||||
|
||||
case object PeripheryTerminalKey extends Field[TerminalParams]
|
||||
|
||||
trait HasPeripheryTerminal { this: BaseSubsystem =>
|
||||
val params = p(PeripheryTerminalKey)
|
||||
val terminal_name = Some("terminal_0")
|
||||
|
||||
val terminal = LazyModule(new TLTerminal(pbus.beatBytes, params))
|
||||
.suggestName(terminal_name)
|
||||
pbus.toVariableWidthSlave(terminal_name) { terminal.node }
|
||||
}
|
||||
|
||||
trait HasPeripheryTerminalBundle {
|
||||
val terminal: TerminalSysIO
|
||||
val dvi: TerminalDVIIO
|
||||
}
|
||||
|
||||
trait HasPeripheryTerminalModuleImp extends LazyModuleImp with HasPeripheryTerminalBundle {
|
||||
val outer: HasPeripheryTerminal
|
||||
val terminal = IO(new TerminalSysIO)
|
||||
val dvi = IO(new TerminalDVIIO)
|
||||
|
||||
// right sides defined in TerminalRegBundle
|
||||
terminal <> outer.terminal.module.io.port_sys
|
||||
dvi <> outer.terminal.module.io.port_dvi
|
||||
}
|
Reference in New Issue
Block a user