Add TLTerminal (write-only terminal TL slave)
This commit is contained in:
parent
7ac56c01af
commit
d7b9834d96
112
src/main/scala/devices/terminal/Terminal.scala
Normal file
112
src/main/scala/devices/terminal/Terminal.scala
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
// 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._
|
||||||
|
|
||||||
|
|
||||||
|
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 writer_fn = (valid: Bool, data: UInt) => {
|
||||||
|
term.io.write_enable := valid
|
||||||
|
term.io.write_data := data
|
||||||
|
Bool(true) // terminal can read at every cycle
|
||||||
|
}
|
||||||
|
|
||||||
|
regmap(
|
||||||
|
0 -> Seq (
|
||||||
|
RegField.w(8, writer_fn, RegFieldDesc(
|
||||||
|
"write", "Write an ASCII character to the terminal."
|
||||||
|
))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user