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

Subversion Repositories zet86

[/] [zet86/] [trunk/] [soc/] [aceusb/] [rtl/] [aceusb_access.v] - Blame information for rev 52

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 52 zeus
/*
2
 * WISHBONE to SystemACE MPU + CY7C67300 bridge
3
 * Copyright (C) 2008 Sebastien Bourdeauducq - http://lekernel.net
4
 * This file is part of Milkymist.
5
 *
6
 * This program is free software: you can redistribute it and/or modify
7
 * it under the terms of the GNU General Public License as published by
8
 * the Free Software Foundation, either version 3 of the License, or
9
 * (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
18
 */
19
 
20
module aceusb_access(
21
        /* Control */
22
        input ace_clkin,
23
        input rst,
24
        input [5:0] a,
25
        input [15:0] di,
26
        output reg [15:0] do,
27
        input read,
28
        input write,
29
        output reg ack,
30
 
31
        /* SystemACE/USB interface */
32
        output [6:1] aceusb_a,
33
        inout [15:0] aceusb_d,
34
        output reg aceusb_oe_n,
35
        output reg aceusb_we_n,
36
 
37
        output reg ace_mpce_n,
38
 
39
        output usb_cs_n,
40
        output usb_hpi_reset_n
41
);
42
 
43
/* USB is not supported yet. Disable the chip. */
44
assign usb_cs_n = 1'b1;
45
assign usb_hpi_reset_n = 1'b1;
46
 
47
/* 16-bit mode only */
48
assign aceusb_a = a;
49
 
50
reg d_drive;
51
assign aceusb_d = d_drive ? di : 16'hzz;
52
 
53
reg d_drive_r;
54
reg aceusb_oe_n_r;
55
reg aceusb_we_n_r;
56
reg ace_mpce_n_r;
57
always @(posedge ace_clkin) begin
58
        d_drive <= d_drive_r;
59
        aceusb_oe_n <= aceusb_oe_n_r;
60
        aceusb_we_n <= aceusb_we_n_r;
61
        ace_mpce_n <= ace_mpce_n_r;
62
end
63
 
64
reg d_in_sample;
65
always @(posedge ace_clkin)
66
        if(d_in_sample)
67
                do <= aceusb_d;
68
 
69
reg [2:0] state;
70
reg [2:0] next_state;
71
 
72
localparam
73
        IDLE = 3'd0,
74
        READ = 3'd1,
75
        READ1 = 3'd2,
76
        READ2 = 3'd3,
77
        WRITE = 3'd4,
78
        ACK = 3'd5;
79
 
80
always @(posedge ace_clkin) begin
81
        if(rst)
82
                state <= IDLE;
83
        else
84
                state <= next_state;
85
end
86
 
87
always @(state or read or write) begin
88
        d_drive_r = 1'b0;
89
        aceusb_oe_n_r = 1'b1;
90
        aceusb_we_n_r = 1'b1;
91
        ace_mpce_n_r = 1'b1;
92
        d_in_sample = 1'b0;
93
        ack = 1'b0;
94
 
95
        next_state = state;
96
 
97
        case(state)
98
                IDLE: begin
99
                        if(read) begin
100
                                ace_mpce_n_r = 1'b0;
101
                                next_state = READ;
102
                        end
103
                        if(write) begin
104
                                ace_mpce_n_r = 1'b0;
105
                                next_state = WRITE;
106
                        end
107
                end
108
 
109
                READ: begin
110
                        ace_mpce_n_r = 1'b0;
111
                        next_state = READ1;
112
                end
113
                READ1: begin
114
                        ace_mpce_n_r = 1'b0;
115
                        aceusb_oe_n_r = 1'b0;
116
                        next_state = READ2;
117
                end
118
                READ2: begin
119
                        d_in_sample = 1'b1;
120
                        next_state = ACK;
121
                end
122
 
123
                WRITE: begin
124
                        d_drive_r = 1'b1;
125
                        ace_mpce_n_r = 1'b0;
126
                        aceusb_we_n_r = 1'b0;
127
                        next_state = ACK;
128
                end
129
 
130
                ACK: begin
131
                        ack = 1'b1;
132
                        next_state = IDLE;
133
                end
134
        endcase
135
end
136
 
137
endmodule

powered by: WebSVN 2.1.0

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