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

Subversion Repositories ao68000

[/] [ao68000/] [trunk/] [tests/] [soc_for_linux_on_terasic_de2_70/] [verilog/] [ssram.v] - Blame information for rev 12

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 12 alfik
/*
2
 * Copyright 2010, Aleksander Osman, alfik@poczta.fm. All rights reserved.
3
 *
4
 * Redistribution and use in source and binary forms, with or without modification, are
5
 * permitted provided that the following conditions are met:
6
 *
7
 *  1. Redistributions of source code must retain the above copyright notice, this list of
8
 *     conditions and the following disclaimer.
9
 *
10
 *  2. Redistributions in binary form must reproduce the above copyright notice, this list
11
 *     of conditions and the following disclaimer in the documentation and/or other materials
12
 *     provided with the distribution.
13
 *
14
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
15
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
16
 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR
17
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
19
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
20
 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
21
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
22
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23
 */
24
 
25
module ssram(
26
        input CLK_I,
27
        input RST_I,
28
 
29
        //slave
30
        output reg [31:0] DAT_O,
31
        input [31:0] DAT_I,
32
        output reg ACK_O,
33
 
34
        input CYC_I,
35
        input [20:2] ADR_I,
36
        input STB_I,
37
        input WE_I,
38
        input [3:0] SEL_I,
39
 
40
        //ssram interface
41
        output [18:0] ssram_address,
42
        output reg ssram_oe_n,
43
        output reg ssram_writeen_n,
44
        output reg ssram_byteen0_n,
45
        output reg ssram_byteen1_n,
46
        output reg ssram_byteen2_n,
47
        output reg ssram_byteen3_n,
48
 
49
        inout [31:0] ssram_data,
50
 
51
        output ssram_clk,
52
        output ssram_mode,
53
        output ssram_zz,
54
        output ssram_globalw_n,
55
        output ssram_advance_n,
56
        output reg ssram_adsp_n,
57
        output ssram_adsc_n,
58
        output ssram_ce1_n,
59
        output ssram_ce2,
60
        output ssram_ce3_n
61
);
62
 
63
assign ssram_address = ADR_I;
64
 
65
assign ssram_clk = CLK_I;
66
assign ssram_mode = 1'b0;
67
assign ssram_zz = 1'b0;
68
assign ssram_globalw_n = 1'b1;
69
assign ssram_advance_n = 1'b1;
70
assign ssram_adsc_n = 1'b1;
71
assign ssram_ce1_n = 1'b0;
72
assign ssram_ce2 = 1'b1;
73
assign ssram_ce3_n = 1'b0;
74
 
75
reg [31:0] ssram_data_o;
76
assign ssram_data = (ssram_oe_n == 1'b1) ? ssram_data_o : 32'dZ;
77
 
78
reg [2:0] counter;
79
 
80
//reg second;
81
 
82
always @(posedge CLK_I) begin
83
        if(RST_I == 1'b1) begin
84
                DAT_O <= 32'd0;
85
                ACK_O <= 1'b0;
86
                //ssram_address <= 19'd0;
87
                ssram_oe_n <= 1'b1;
88
                ssram_writeen_n <= 1'b1;
89
                ssram_byteen0_n <= 1'b1;
90
                ssram_byteen1_n <= 1'b1;
91
                ssram_byteen2_n <= 1'b1;
92
                ssram_byteen3_n <= 1'b1;
93
                ssram_data_o <= 32'd0;
94
                ssram_adsp_n <= 1'b1;
95
                counter <= 3'd0;
96
 
97
                //second <= 1'b0;
98
        end
99
        else begin
100
 
101
                if(CYC_I == 1'b1 && STB_I == 1'b1 && WE_I == 1'b0 && ACK_O == 1'b0) begin
102
 
103
                        if(counter == 3'd0) begin
104
                                ssram_adsp_n <= 1'b0;
105
                                //ssram_address <= ADR_I;
106
 
107
                                counter <= counter + 3'd1;
108
                        end
109
                        else if(counter == 3'd1) begin
110
                                ssram_adsp_n <= 1'b1;
111
                                ssram_writeen_n <= 1'b1;
112
                                ssram_byteen0_n <= 1'b0;
113
                                ssram_byteen1_n <= 1'b0;
114
                                ssram_byteen2_n <= 1'b0;
115
                                ssram_byteen3_n <= 1'b0;
116
 
117
                                counter <= counter + 3'd1;
118
                        end
119
                        else if(counter == 3'd2) begin
120
                                ssram_oe_n <= 1'b0;
121
 
122
                                counter <= counter + 3'd1;
123
                        end
124
                        else if(counter == 3'd3) begin
125
                                ssram_oe_n <= 1'b1;
126
 
127
                                counter <= 3'd0;
128
                                DAT_O <= ssram_data;
129
                                ACK_O <= 1'b1;
130
                        end
131
 
132
                end
133
                else if(CYC_I == 1'b1 && STB_I == 1'b1 && WE_I == 1'b1 && ACK_O == 1'b0) begin
134
 
135
                        if(counter == 3'd0) begin
136
                                ssram_adsp_n <= 1'b0;
137
                                //ssram_address <= ADR_I[20:2];
138
                                ssram_oe_n <= 1'b1;
139
 
140
                                counter <= counter + 3'd1;
141
                        end
142
                        else if(counter == 3'd1) begin
143
                                ssram_adsp_n <= 1'b1;
144
                                ssram_writeen_n <= 1'b0;
145
                                ssram_byteen0_n <= (SEL_I[0] == 1'b1) ? 1'b0 : 1'b1;
146
                                ssram_byteen1_n <= (SEL_I[1] == 1'b1) ? 1'b0 : 1'b1;
147
                                ssram_byteen2_n <= (SEL_I[2] == 1'b1) ? 1'b0 : 1'b1;
148
                                ssram_byteen3_n <= (SEL_I[3] == 1'b1) ? 1'b0 : 1'b1;
149
                                ssram_data_o <= DAT_I;
150
 
151
                                counter <= counter + 3'd1;
152
                        end
153
                        else if(counter == 3'd2) begin
154
                                ssram_writeen_n <= 1'b1;
155
 
156
                                counter <= 3'd0;
157
                                ACK_O <= 1'b1;
158
                        end
159
                end
160
                else begin
161
                        ACK_O <= 1'b0;
162
                end
163
        end
164
end
165
 
166
 
167
endmodule

powered by: WebSVN 2.1.0

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