xref: /XiangShan/src/main/scala/device/AXI4Keyboard.scala (revision 956d83c0f98bae64d3d4939708d2b7809038e7f4)
1ac67b1cbSZihao Yupackage device
2ac67b1cbSZihao Yu
3ac67b1cbSZihao Yuimport chisel3._
4ac67b1cbSZihao Yuimport chisel3.util._
5*956d83c0Slinjiaweiimport chipsalliance.rocketchip.config.Parameters
6*956d83c0Slinjiaweiimport freechips.rocketchip.diplomacy.AddressSet
7ac67b1cbSZihao Yuimport utils._
8ac67b1cbSZihao Yu
9ac67b1cbSZihao Yuclass KeyboardIO extends Bundle {
10ac67b1cbSZihao Yu  val ps2Clk = Input(Bool())
11ac67b1cbSZihao Yu  val ps2Data = Input(Bool())
12ac67b1cbSZihao Yu}
13ac67b1cbSZihao Yu
14ac67b1cbSZihao Yu// this Module is not tested
15*956d83c0Slinjiaweiclass AXI4Keyboard
16*956d83c0Slinjiawei(
17*956d83c0Slinjiawei  address: AddressSet
18*956d83c0Slinjiawei)(implicit p: Parameters)
19*956d83c0Slinjiawei  extends AXI4SlaveModule(address, executable = false, _extra = new KeyboardIO)
20*956d83c0Slinjiawei{
21*956d83c0Slinjiawei  override lazy val module = new AXI4SlaveModuleImp[KeyboardIO](this){
22ac67b1cbSZihao Yu    val buf = Reg(UInt(10.W))
23ac67b1cbSZihao Yu    val ps2ClkLatch = RegNext(io.extra.get.ps2Clk)
24ac67b1cbSZihao Yu    val negedge = RegNext(ps2ClkLatch) && ~ps2ClkLatch
25ac67b1cbSZihao Yu    when (negedge) { buf := Cat(io.extra.get.ps2Data, buf(9,1)) }
26ac67b1cbSZihao Yu
27ac67b1cbSZihao Yu    val cnt = Counter(negedge, 10)
28ac67b1cbSZihao Yu    val queue = Module(new Queue(UInt(8.W), 8))
29ac67b1cbSZihao Yu    queue.io.enq.valid := cnt._2 && !buf(0) && io.extra.get.ps2Data && buf(9,1).xorR
30ac67b1cbSZihao Yu    queue.io.enq.bits := buf(8,1)
31ac67b1cbSZihao Yu    queue.io.deq.ready := in.r.ready
32ac67b1cbSZihao Yu
33ac67b1cbSZihao Yu    in.r.bits.data := Mux(queue.io.deq.valid, queue.io.deq.bits, 0.U)
34ac67b1cbSZihao Yu  }
35*956d83c0Slinjiawei
36*956d83c0Slinjiawei}
37