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

Subversion Repositories xulalx25soc

[/] [xulalx25soc/] [trunk/] [rtl/] [uartdev.v] - Blame information for rev 2

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

Line No. Rev Author Line
1 2 dgisselq
////////////////////////////////////////////////////////////////////////////////
2
//
3
// Filename:    uartdev.v
4
//
5
// Project:     XuLA2 board
6
//
7
// Purpose:     
8
//
9
//
10
// Creator:     Dan Gisselquist, Ph.D.
11
//              Gisselquist Technology, LLC
12
//
13
////////////////////////////////////////////////////////////////////////////////
14
//
15
// Copyright (C) 2015, Gisselquist Technology, LLC
16
//
17
// This program is free software (firmware): you can redistribute it and/or
18
// modify it under the terms of  the GNU General Public License as published
19
// by the Free Software Foundation, either version 3 of the License, or (at
20
// your option) any later version.
21
//
22
// This program is distributed in the hope that it will be useful, but WITHOUT
23
// ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY or
24
// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
25
// for more details.
26
//
27
// License:     GPL, v3, as defined and found on www.gnu.org,
28
//              http://www.gnu.org/licenses/gpl.html
29
//
30
//
31
////////////////////////////////////////////////////////////////////////////////
32
//
33
//
34
module  uartdev(i_clk, i_rx_uart, o_tx_uart,
35
                i_wb_cyc, i_wb_stb, i_wb_we, i_wb_addr, i_wb_data,
36
                        o_wb_ack, o_wb_stall, o_wb_data,
37
                o_rx_int, o_tx_int);
38
        parameter       DEFAULT_SETUP = { 2'b00, 1'b0, 1'b0, 2'b00, 24'd10417 };
39
        input                   i_clk, i_rx_uart;
40
        output  wire            o_tx_uart;
41
        input                   i_wb_cyc, i_wb_stb, i_wb_we;
42
        input           [1:0]    i_wb_addr;
43
        input           [31:0]   i_wb_data;
44
        output  reg             o_wb_ack;
45
        output  wire            o_wb_stall;
46
        output  reg     [31:0]   o_wb_data;
47
        output  wire            o_rx_int, o_tx_int;
48
 
49
        reg     [29:0]   r_setup;
50
        reg             r_tx_stb, rx_rdy;
51
        reg     [7:0]    r_tx_data;
52
        initial r_setup = DEFAULT_SETUP;
53
        always @(posedge i_clk)
54
                if ((i_wb_cyc)&&(i_wb_stb)&&(i_wb_we))
55
                begin
56
                        case(i_wb_addr)
57
                        2'b00: r_setup <= i_wb_data[29:0];
58
                        2'b10: begin
59
                                r_tx_data <= i_wb_data[7:0];
60
                                r_tx_stb <= 1'b1;
61
                                end
62
                        default: begin end
63
                        endcase
64
                end else
65
                        r_tx_stb <= 1'b0;
66
 
67
        wire    rx_stb, rx_break, rx_parity_err, rx_frame_err, rx_ignored;
68
        wire    [7:0]    rx_data;
69
        rxuart  rxmod(i_clk, 1'b0, r_setup, i_rx_uart,
70
                        rx_stb, rx_data, rx_break,
71
                        rx_parity_err, rx_frame_err, rx_ignored);
72
 
73
        wire    tx_break, tx_busy;
74
        assign  tx_break = 1'b0;
75
        txuart  txmod(i_clk, 1'b0, r_setup, tx_break, r_tx_stb, r_tx_data,
76
                        o_tx_uart, tx_busy);
77
 
78
        reg     [7:0]    r_data;
79
        always @(posedge i_clk)
80
                if (rx_stb)
81
                        r_data <= rx_data;
82
        always @(posedge i_clk)
83
        begin
84
                if (rx_stb)
85
                        rx_rdy <= (rx_rdy | rx_stb);
86
 
87
                case(i_wb_addr)
88
                2'b00: o_wb_data <= { 2'b00, r_setup };
89
                2'b01: o_wb_data <= { 2'b00, r_setup };
90
                2'b10: o_wb_data <= { 31'h00,tx_busy };
91
                2'b11: begin
92
                        if ((i_wb_cyc)&&(i_wb_stb)&&(~i_wb_we))
93
                                rx_rdy <= 1'b0;
94
                        o_wb_data <= { 20'h00, rx_break, rx_frame_err, rx_parity_err, ~rx_rdy, r_data };
95
                        end
96
                endcase
97
                o_wb_ack <= (i_wb_cyc)&&(i_wb_stb);
98
        end
99
 
100
        assign  o_wb_stall = 1'b0;
101
        assign  o_rx_int = rx_stb;
102
        assign  o_tx_int = ~tx_busy;
103
 
104
endmodule

powered by: WebSVN 2.1.0

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