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

Subversion Repositories s80186

[/] [s80186/] [trunk/] [fpga/] [spi/] [SPIPorts.sv] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 jamieiles
// Copyright Jamie Iles, 2017
2
//
3
// This file is part of s80x86.
4
//
5
// s80x86 is free software: you can redistribute it and/or modify
6
// it under the terms of the GNU General Public License as published by
7
// the Free Software Foundation, either version 3 of the License, or
8
// (at your option) any later version.
9
//
10
// s80x86 is distributed in the hope that it will be useful,
11
// but WITHOUT ANY WARRANTY; without even the implied warranty of
12
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
// GNU General Public License for more details.
14
//
15
// You should have received a copy of the GNU General Public License
16
// along with s80x86.  If not, see .
17
 
18
module SPIPorts(input logic clk,
19
                input logic reset,
20
                input logic cs,
21
                input logic [1:1] data_m_addr,
22
                input logic [15:0] data_m_data_in,
23
                output logic [15:0] data_m_data_out,
24
                input logic [1:0] data_m_bytesel,
25
                input logic data_m_wr_en,
26
                input logic data_m_access,
27
                output logic data_m_ack,
28
                input logic miso,
29
                output logic mosi,
30
                output logic sclk,
31
                output logic ncs);
32
 
33
wire access_control = ~data_m_addr[1] & cs & data_m_access;
34
wire access_xfer = data_m_addr[1] & cs & data_m_access;
35
 
36
reg [8:0] divider;
37
 
38
reg xfer_start;
39
wire xfer_complete;
40
reg xfer_busy;
41
reg [7:0] tx_data;
42
wire [7:0] rx_data;
43
 
44
SPIMaster SPIMaster(.*);
45
 
46
always_ff @(posedge clk or posedge reset) begin
47
    if (reset) begin
48
        divider <= 9'b0;
49
        ncs <= 1'b0;
50
    end else if (access_control & data_m_wr_en) begin
51
        {ncs, divider} <= {data_m_data_in[9], data_m_data_in[8:0]};
52
    end
53
end
54
 
55
always_ff @(posedge clk)
56
    if (access_control && !data_m_wr_en)
57
        data_m_data_out <= {6'b0, ncs, divider};
58
    else if (access_xfer & ~data_m_wr_en)
59
        data_m_data_out <= {7'b0, xfer_busy, rx_data};
60
    else
61
        data_m_data_out <= 16'b0;
62
 
63
always_ff @(posedge clk or posedge reset) begin
64
    if (reset) begin
65
        tx_data <= 8'b0;
66
        xfer_start <= 1'b0;
67
        xfer_busy <= 1'b0;
68
    end else begin
69
        xfer_start <= access_xfer & data_m_wr_en;
70
 
71
        if (xfer_complete)
72
            xfer_busy <= 1'b0;
73
        if (access_xfer & data_m_wr_en) begin
74
            xfer_busy <= 1'b1;
75
            tx_data <= data_m_data_in[7:0];
76
        end
77
    end
78
end
79
 
80
always_ff @(posedge clk)
81
    data_m_ack <= data_m_access & cs;
82
 
83
endmodule

powered by: WebSVN 2.1.0

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