OpenCores
URL https://opencores.org/ocsvn/vg_z80_sbc/vg_z80_sbc/trunk

Subversion Repositories vg_z80_sbc

[/] [vg_z80_sbc/] [trunk/] [rtl/] [wb_uart.v] - Blame information for rev 36

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 hharte
//---------------------------------------------------------------------------
2 27 hharte
// Wishbone UARTs / PS/2 ASCII Keyboard Top-Level
3 3 hharte
//
4 27 hharte
// Register Description:
5
//
6
// KB 0x01 STATUS    [ 0 |kry| 0 | 0 | 0 | 0  | 0   |          | ~key_rdy ]
7
// KB 0x01 DATA      [                  KEYBOARD DATA                     ]
8
// U1 0x02 COND      [                       DATA                         ]
9
// U1 0x03 CONS      [ 0 | 0 | 0 | 0 | 0 | rx_error | rx_avail | tx_ready ]
10
// U2 0x04 COND      [                       DATA                         ]
11
// U2 0x05 CONS      [ 0 | 0 | 0 | 0 | 0 | rx_error | rx_avail | tx_ready ]
12
// U3 0x06 COND      [                       DATA                         ]
13
// U3 0x07 CONS      [ 0 | 0 | 0 | 0 | 0 | rx_error | rx_avail | tx_ready ]
14 3 hharte
//
15
//---------------------------------------------------------------------------
16
 
17
module wb_uart #(
18 22 hharte
        parameter          clk_freq = 25000000,
19 3 hharte
        parameter          baud     = 115200
20
) (
21
        input              clk,
22
        input              reset,
23
        // Wishbone interface
24
        input              wb_stb_i,
25
        input              wb_cyc_i,
26
        output             wb_ack_o,
27
        input              wb_we_i,
28
        input       [31:0] wb_adr_i,
29
        input        [3:0] wb_sel_i,
30
        input       [31:0] wb_dat_i,
31
        output reg  [31:0] wb_dat_o,
32
        // Serial Wires
33 22 hharte
        inout              ps2_clk,
34
        inout              ps2_data,
35 3 hharte
        input              uart1_rxd,
36
        output             uart1_txd,
37
        input              uart2_rxd,
38
        output             uart2_txd,
39
        input              uart3_rxd,
40
        output             uart3_txd
41
);
42
 
43
//---------------------------------------------------------------------------
44
// Actual UART engine
45
//---------------------------------------------------------------------------
46
wire [7:0] rx_data[0:3];
47
wire       rx_avail[0:3];
48
wire       rx_error[0:3];
49
reg        rx_ack[0:3];
50
wire [7:0] tx_data;
51
reg        tx_wr[0:3];
52
wire       tx_busy[0:3];
53
 
54
 
55
wire    rx_extended;
56
wire    rx_released;
57 27 hharte
wire    rx_shift_key_on;
58 22 hharte
wire    rx_ctrl_key_on;
59 3 hharte
wire    [7:0] rx_scan_code;
60
wire    rx_data_ready;
61
wire    tx_write_ack_o;
62
wire    tx_error_no_keyboard_ack;
63
 
64
// Instantiate the module
65 22 hharte
ps2_keyboard_interface #(
66
    .TRAP_SHIFT_KEYS_PP(1)
67
) ps2_kbd (
68 3 hharte
    .clk(clk),
69
    .reset(reset),
70
    .ps2_clk(ps2_clk),
71
    .ps2_data(ps2_data),
72
    .rx_extended(rx_extended),
73
    .rx_released(rx_released),
74 27 hharte
    .rx_shift_key_on(rx_shift_key_on),
75 22 hharte
    .rx_ctrl_key_on(rx_ctrl_key_on),
76 3 hharte
    .rx_scan_code(rx_scan_code),
77
    .rx_ascii(rx_data[0]),
78
    .rx_data_ready(rx_avail[0]),
79
    .rx_read(rx_ack[0]),
80
    .tx_data(tx_data),
81
    .tx_write(tx_wr[0]),
82
    .tx_write_ack_o(tx_write_ack_o),
83
    .tx_error_no_keyboard_ack(tx_error_no_keyboard_ack)
84
    );
85
 
86
uart #(
87
        .freq_hz(   clk_freq ),
88
        .baud(      baud     )
89
) uart1 (
90
        .clk(       clk      ),
91
        .reset(     reset    ),
92
        //
93
        .uart_rxd(  uart1_rxd ),
94
        .uart_txd(  uart1_txd ),
95
        //
96
        .rx_data(   rx_data[1]  ),
97
        .rx_avail(  rx_avail[1] ),
98
        .rx_error(  rx_error[1] ),
99
        .rx_ack(    rx_ack[1]   ),
100
        .tx_data(   tx_data  ),
101
        .tx_wr(     tx_wr[1]    ),
102
        .tx_busy(   tx_busy[1]  )
103
);
104
 
105
uart #(
106
        .freq_hz(   clk_freq ),
107
        .baud(      baud     )
108
) uart2 (
109
        .clk(       clk      ),
110
        .reset(     reset    ),
111
        //
112
        .uart_rxd(  uart2_rxd ),
113
        .uart_txd(  uart2_txd ),
114
        //
115
        .rx_data(   rx_data[2]  ),
116
        .rx_avail(  rx_avail[2] ),
117
        .rx_error(  rx_error[2] ),
118
        .rx_ack(    rx_ack[2]   ),
119
        .tx_data(   tx_data  ),
120
        .tx_wr(     tx_wr[2]    ),
121
        .tx_busy(   tx_busy[2]  )
122
);
123
 
124
uart #(
125
        .freq_hz(   clk_freq ),
126
        .baud(      baud     )
127
) uart3 (
128
        .clk(       clk      ),
129
        .reset(     reset    ),
130
        //
131
        .uart_rxd(  uart3_rxd ),
132
        .uart_txd(  uart3_txd ),
133
        //
134
        .rx_data(   rx_data[3]  ),
135
        .rx_avail(  rx_avail[3] ),
136
        .rx_error(  rx_error[3] ),
137
        .rx_ack(    rx_ack[3]   ),
138
        .tx_data(   tx_data  ),
139
        .tx_wr(     tx_wr[3]    ),
140
        .tx_busy(   tx_busy[3]  )
141
);
142
 
143
//---------------------------------------------------------------------------
144
// 
145
//---------------------------------------------------------------------------
146 22 hharte
wire    [1:0] sel_port = wb_adr_i[2:1];
147 3 hharte
 
148 22 hharte
wire [7:0] ucr = { 5'b0, rx_error[sel_port], rx_avail[sel_port], ~tx_busy[sel_port] };
149
 
150 3 hharte
wire    key_ready = (~rx_released) & rx_avail[0];
151
wire    [7:0] kbdsr = {1'b0, key_ready, 5'b0, ~key_ready};
152
 
153
wire wb_rd = wb_stb_i & wb_cyc_i & ~wb_we_i;
154 22 hharte
wire wb_wr = wb_stb_i & wb_cyc_i &  wb_we_i;
155 3 hharte
 
156
reg  ack;
157
 
158
assign wb_ack_o       = wb_stb_i & wb_cyc_i & ack;
159
 
160
assign tx_data = wb_dat_i[7:0];
161
 
162
always @(posedge clk)
163
begin
164
        if (reset) begin
165
                wb_dat_o[31:8] <= 24'b0;
166
                tx_wr[0]  <= 0;
167
                rx_ack[0] <= 0;
168
                tx_wr[1]  <= 0;
169
                rx_ack[1] <= 0;
170
                tx_wr[2]  <= 0;
171
                rx_ack[2] <= 0;
172
                tx_wr[3]  <= 0;
173
                rx_ack[3] <= 0;
174
                ack    <= 0;
175
        end else begin
176
                wb_dat_o[31:8] <= 24'b0;
177
                tx_wr[0]  <= 0;
178
                rx_ack[0] <= 0;
179
                tx_wr[1]  <= 0;
180
                rx_ack[1] <= 0;
181
                tx_wr[2]  <= 0;
182
                rx_ack[2] <= 0;
183
                tx_wr[3]  <= 0;
184
                rx_ack[3] <= 0;
185
                ack    <= 0;
186
 
187
                if (wb_rd & ~ack) begin
188
                        ack <= 1;
189
 
190 10 hharte
                        case (wb_adr_i[2:0])
191 3 hharte
                        3'b000: begin
192
                                wb_dat_o[7:0] <= kbdsr;
193
                        end
194
                        3'b001: begin
195 27 hharte
                                if(rx_ctrl_key_on) begin
196
                    wb_dat_o[7:0] <= { 2'b00, rx_data[sel_port][5:0] };
197
                end else begin
198
                    wb_dat_o[7:0] <= rx_data[sel_port];
199 22 hharte
                end
200
                                rx_ack[sel_port]        <= 1;
201 3 hharte
                        end
202
                        3'b010: begin
203 22 hharte
                                wb_dat_o[7:0] <= rx_data[sel_port];
204
                                rx_ack[sel_port]        <= 1;
205 3 hharte
                        end
206
                        3'b011: begin
207
                                wb_dat_o[7:0] <= ucr;
208
                        end
209
                        3'b100: begin
210 22 hharte
                                wb_dat_o[7:0] <= rx_data[sel_port];
211
                                rx_ack[sel_port]        <= 1;
212 3 hharte
                        end
213
                        3'b101: begin
214
                                wb_dat_o[7:0] <= ucr;
215
                        end
216
                        3'b110: begin
217 22 hharte
                                wb_dat_o[7:0] <= rx_data[sel_port];
218
                                rx_ack[sel_port]        <= 1;
219 3 hharte
                        end
220
                        3'b111: begin
221
                                wb_dat_o[7:0] <= ucr;
222
                        end
223
 
224
                        default: begin
225
                                wb_dat_o[7:0] <= 8'b0;
226
                        end
227
                        endcase
228
                end else if (wb_wr & ~ack ) begin
229
                        ack <= 1;
230
 
231 22 hharte
                        if ((wb_adr_i[0] == 1'b0) && ~tx_busy[sel_port]) begin
232
                                tx_wr[sel_port] <= 1;
233 3 hharte
                        end
234
                end
235
        end
236
end
237
 
238
 
239
endmodule

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.