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

Subversion Repositories spi2ram

[/] [spi2ram/] [trunk/] [spi2ram.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 longquan
module spi2ram
2
(
3
    //spi interface
4
    input spi_sck,
5
    input spi_cs,
6
    input spi_mosi,
7
    output  spi_miso,
8
    //ram interface  
9
 
10
    output [15:0] sAddress ,
11
    output sCSn,
12
    output sOEn,
13
    output sWRn,
14
    output sDqDir,
15
    output [7:0] sDqOut,
16
    input [7:0] sDqIn
17
);
18
 
19
    reg [7:0] rINBUF;
20
    reg [7:0] rOUTBUF;
21
    assign spi_miso = rOUTBUF[7];
22
 
23
 
24
    reg [5:0] rCnt;
25
    reg  rCntOV;
26
    wire sCnt8;
27
    assign sCnt8 = (~|(rCnt[2:0])) & ((|rCnt[5:3]) | rCntOV);
28
    //assign sCnt8 = (~|(rCnt[2:0])) & ((|rCnt[5:3]) );
29
 
30
 
31
    reg [7:0] rCmd;
32
    reg [7:0] rState;
33
    reg [15:0] rAddress;
34
    reg rReadFlag1, rReadFlag2;
35
    assign sAddress = rReadFlag1 ? {rAddress[15:8], rINBUF} : rAddress;
36
 
37
    wire sRamOE;
38
    assign sRamOE = sCnt8 & (rReadFlag1 | rReadFlag2);
39
 
40
    reg rWriteFlag1;
41
    wire sRamWR;
42
    assign sRamWR = sCnt8 & spi_sck & rWriteFlag1;
43
 
44
 
45
    //reg [7:0] rRamWrBuf; 
46
    //assign sDqOut = sRamWR?rINBUF:8'h00;
47
    assign sDqOut =  rINBUF;
48
 
49
    reg rCmdGotFlag;
50
 
51
 
52
    assign sCSn = sOEn & sWRn;
53
    assign sOEn = ~sRamOE;
54
    assign sWRn = ~sRamWR;
55
    assign sDqDir = sRamWR;
56
 
57
    always@(posedge spi_sck , posedge spi_cs )begin
58
        if(spi_cs)begin
59
            rINBUF <= 'b0;
60
            rCnt <= 'b0;
61
        end
62
        else
63
        begin
64
            rINBUF <= {rINBUF[6:0], spi_mosi};
65
            rCnt <= rCnt + 1'b1;
66
        end
67
    end
68
 
69
 
70
 
71
    always@( negedge spi_sck , posedge spi_cs ) begin
72
 
73
        if(spi_cs)begin
74
            rWriteFlag1 <= 'b0;
75
            rReadFlag1 <= 'b0;
76
            rReadFlag2 <= 'b0;
77
            rAddress <= 'b0;
78
            rCmdGotFlag <= 0;
79
            rCmd  <= 0;
80
                                rCntOV <= 1'b0;
81
        end
82
        else
83
        if(sCnt8)begin
84
            if(!rCmdGotFlag)begin
85
                rCmdGotFlag <= 1'b1;
86
                                         rCntOV <= 1'b1;
87
                rCmd <= rINBUF;
88
                if(rINBUF == 8'h05) rOUTBUF <= rState;
89
                if(rINBUF == 8'h04) rState[1] <= 1'b0;
90
                if(rINBUF == 8'h06) rState[1] <= 1'b1;
91
                if(rINBUF == 8'h9f) rOUTBUF <= 8'h20;
92
            end
93
            else begin
94
                case(rCmd[3:0])
95
                4'h1:begin
96
                    if( rCnt[5:3] == 3'b010 ) rState <= rINBUF;
97
                    end
98
                4'h2:begin
99
                    if( rWriteFlag1 == 'b0 )begin
100
                        case( rCnt[5:3])
101
                        3'b010: begin
102
                            rAddress[15:8] <= rINBUF;
103
                        end
104
                        3'b011: begin
105
                            rAddress[15:0] <= {rAddress[15:8], rINBUF};
106
                            rWriteFlag1 <= 1'b1;
107
                        end
108
                        endcase
109
                    end
110
                    else begin
111
                        //rRamWrBuf <= rINBUF;
112
                        rAddress <= rAddress + 1'b1;
113
                    end
114
 
115
                    end
116
                4'h3:begin
117
                    if( rReadFlag2 == 'b0 )begin
118
                        case( rCnt[5:3])
119
                        3'b010: begin
120
                                                                        rAddress[15:8] <= rINBUF;
121
                                                                        rOUTBUF <= 8'h00;
122
                                                                        rReadFlag1 <= 'b1;
123
                                                                        end
124
                        3'b011: begin
125
                                                                        rAddress[15:0] <= {rAddress[15:8], rINBUF} + 1'b1;
126
                                                                        rOUTBUF <= sDqIn;
127
                                                                        rReadFlag2 <= 'b1;
128
                                                                        rReadFlag1<= 'b0;
129
                        end
130
                        endcase
131
                    end
132
                    else begin
133
                        rOUTBUF <= sDqIn;
134
                        rAddress <= rAddress + 1'b1;
135
                    end
136
                    end
137
                4'h4:begin
138
 
139
                    end
140
                4'h5:begin
141
                                                                rOUTBUF <= rState;
142
                    end
143
                4'h6:begin
144
 
145
                    end
146
                4'hf:begin
147
                        case( rCnt[5:3])
148
                        3'b010: begin
149
                            rOUTBUF <= 8'h11;
150
                        end
151
                        3'b011: begin
152
                            rOUTBUF <= 8'h22;
153
                        end
154
                        endcase
155
                    end
156
                 default:begin
157
 
158
                    end
159
                endcase
160
            end
161
        end
162
        else begin
163
            rOUTBUF <= {rOUTBUF[6:0],1'b0};
164
        end
165
    end
166
 
167
 
168
endmodule

powered by: WebSVN 2.1.0

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