|
CDL Modules
|
Files | |
| file | apb_target_timer.cdl |
| Simple timer target for an APB bus. | |
| module apb_target_ps2_host::apb_target_ps2_host | ( | clock | clk, |
| input bit | reset_n, | ||
| input t_apb_request | apb_request, | ||
| output t_apb_response | apb_response, | ||
| input t_ps2_pins | ps2_in, | ||
| output t_ps2_pins | ps2_out | ||
| ) |
This module provides an APB target to read data from a PS2 host interface, particularly for a PS2 keyboard or mouse.
Before use, the clock divider must be set up with a write to the state.
The state register is
| Bits | Meaning |
|---|---|
| 16;16 | ps2_state.divider_3us (number of ticks to get approx 3us) |
| 15 | 0 |
| 3;12 | fifo_wptr |
| 11 | 0 |
| 3;8 | fifo_rptr |
| 2;6 | 0 |
| 5 | fifo full |
| 4 | fifo empty |
| 3 | fifo overflow occurred since last read |
| 2 | PS2 timeout occurred since last read |
| 1 | PS2 protocol error occurred since last read |
| 0 | PS2 parity error occurred since last read |
The fifo register is:
| Bits | Meaning |
|---|---|
| 31 | Fifo empty (data invalid) |
| 23; 8 | 0 |
| 8; 0 | PS2 Rx data |
The usage model is to poll bit 4 of the state register (the fifo empty bit); when this is cleared the fifo register will have at least one received byte; this may then be read.
An alternative is to poll the fifo register itself, and check if the top bit is clear; if so, the bottom eight bits contain valid data. This will set the FIFO underflow bit, on every read when there is no valid receive data.
| [in] | clk | System clock |
| [in] | reset_n | Active low reset |
| [in] | apb_request | APB request |
| [out] | apb_response | APB response |
| [in] | ps2_in | Pin values from the outside |
| [out] | ps2_out | Pin values to drive - 1 means float high, 0 means pull low |
1.8.11