๐Ÿ“ฆ danielfspencer / blizzard-4-hw

๐Ÿ“„ io.v ยท 59 lines
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59`include "headers/bus.vh"
`include "headers/clocks.vh"
`include "headers/addresses.vh"

module io (
    input ps2_data,
    input ps2_clock,
    `CLOCKS,
    `BUSES
    );

    reg out_en;
    reg `WORD out_buffer;

    always @ (posedge reset) out_en <= 0;
    always @ (negedge write_clk) out_en <= 0;

    always @ (posedge read_clk) begin
        if (read_bus == `IO_POP && !fifo_empty) begin
            out_en <= 1;
            out_buffer <= read_byte;
        end
    end

    assign data_bus = out_en ? out_buffer : `WORD_SIZE'hz;

    // ps2 decoding and fifo
    wire input_ready;
    wire [7:0] input_byte;

    wire [7:0] read_byte;
    wire fifo_empty;

    async_fifo # (
        .DATA_WIDTH(8),
        .ADDR_WIDTH(8)
    ) fifo (
        .areset(reset),

        .write_clk(input_ready),
        .write_en(1),
        .write_data(input_byte),

        .read_clk(out_en),
        .read_en(1),
        .read_data(read_byte),
        .empty(fifo_empty)
    );

    ps2_interface decoder(
        .reset(reset),
        .ps2_data(ps2_data),
        .ps2_clock(ps2_clock),

        .rx_data(input_byte),
        .rx_done(input_ready)
    );
endmodule