1234567891011121314151617181920212223242526272829303132 |
- MODULE MouseP (
- IN clk, rst: BIT;
- INOUT io: [2] BIT;
- OUT out: [28] BIT);
- (* init mouse cmd F4 (start reporting) with start, parity and stop bits added *)
- CONST InitBuf := $FFFFFDE8; (* 1...1 1 0 1111 0100 0 *)
- TYPE IOBUF = MODULE (IN I: BIT; OUT O: BIT; INOUT IO: BIT; IN T: BIT) ^;
- REG (clk) x, y: [10] BIT; (*counters*)
- btns: [3] BIT;
- Q0, Q1, run: BIT;
- shreg: [32] BIT;
- VAR buf0, buf1: IOBUF;
- msclk, msdat: BIT;
- shift, endbit, reply: BIT;
- dx, dy: [10] BIT;
- BEGIN
- buf0 (0, msclk, io.0, rst);
- buf1 (0, msdat, io.1, run | shreg.0);
- shift := Q1 & ~Q0; (*falling edge detector*)
- reply := ~run & ~shreg.11; (*start bit of echoed initBuf, if response*)
- endbit := run & ~shreg.0; (*normal packet received*)
- dx := {shreg.5 !2, shreg.7 -> 0'8 : shreg[19:12]}; (*sign + ovfl*)
- dy := {shreg.6 !2, shreg.8 -> 0'8 : shreg[30:23]}; (*sign + ovfl*)
- out := {run, btns, 0'2, y, 0'2, x};
- run := rst & (reply | run);
- Q0 := msclk; Q1 := Q0;
- shreg := ~rst -> InitBuf : (endbit | reply) -> $FFFFFFFF'32 : shift -> {msdat, shreg[31:1]} : shreg;
- x := ~rst -> 0'10 : endbit -> x + dx : x;
- y := ~rst -> 0'10 : endbit -> y + dy : y;
- btns := ~rst -> 0'3 : endbit -> {shreg.1, shreg.3, shreg.2} : btns
- END MouseP.
|