OpenCores
URL https://opencores.org/ocsvn/sdhc-sc-core/sdhc-sc-core/trunk

Subversion Repositories sdhc-sc-core

[/] [sdhc-sc-core/] [trunk/] [grpSd/] [unitSdData/] [src/] [SdData-Rtl-a.vhdl] - Blame information for rev 185

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 164 rkastl
-- SDHC-SC-Core
2
-- Secure Digital High Capacity Self Configuring Core
3 92 rkastl
-- 
4 170 rkastl
-- (C) Copyright 2010, Rainer Kastl
5
-- All rights reserved.
6 164 rkastl
-- 
7 170 rkastl
-- Redistribution and use in source and binary forms, with or without
8
-- modification, are permitted provided that the following conditions are met:
9
--     * Redistributions of source code must retain the above copyright
10
--       notice, this list of conditions and the following disclaimer.
11
--     * Redistributions in binary form must reproduce the above copyright
12
--       notice, this list of conditions and the following disclaimer in the
13
--       documentation and/or other materials provided with the distribution.
14
--     * Neither the name of the <organization> nor the
15
--       names of its contributors may be used to endorse or promote products
16
--       derived from this software without specific prior written permission.
17 164 rkastl
-- 
18 170 rkastl
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  "AS IS" AND
19
-- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20
-- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21
-- DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
22
-- DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23
-- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24
-- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25
-- ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26
-- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27
-- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 164 rkastl
-- 
29
-- File        : SdData-Rtl-a.vhdl
30
-- Owner       : Rainer Kastl
31
-- Description : FSM for sending and receiving data via the SD Bus
32
-- Links       : SD Spec 2.00
33
-- 
34 92 rkastl
 
35
architecture Rtl of SdData is
36
 
37 167 rkastl
        type aState is (idle, send, receive, crcstatus, checkbusy); -- overall states
38 132 rkastl
        type aRegion is (startbit, data, crc, endbit); -- regions in send and receive state
39 134 rkastl
        subtype aCounter is unsigned(LogDualis(512*8)-1 downto 0); -- bit counter
40 92 rkastl
 
41 167 rkastl
        subtype aCrcStatus is std_ulogic_vector(2 downto 0);
42
 
43 132 rkastl
        -- all registers
44 92 rkastl
        type aReg is record
45 133 rkastl
                State   : aState;
46
                Region  : aRegion;
47 134 rkastl
                Counter : aCounter;
48 132 rkastl
 
49 133 rkastl
                Mode : aSdDataBusMode; -- standard or wide SD mode
50 132 rkastl
 
51 133 rkastl
                Word        : aWord; -- temporary save for data to write to the read fifo
52 136 rkastl
                WordInvalid : std_ulogic; -- after starting receiving we have to wait for the word to be valid before it can be written to the read fifo
53 132 rkastl
 
54
                -- outputs
55 126 rkastl
                Data          : aoSdData;
56
                Controller    : aSdDataToController;
57
                ReadWriteFifo : aoReadFifo;
58
                WriteReadFifo : aoWriteFifo;
59
                DisableSdClk  : std_ulogic;
60 167 rkastl
                CrcStatus     : aCrcStatus;
61 92 rkastl
        end record aReg;
62
 
63 132 rkastl
        -- default value for registers
64 92 rkastl
        constant cDefaultReg : aReg := (
65 126 rkastl
        State         => idle,
66
        Region        => startbit,
67 134 rkastl
        Counter       => (others => '0'),
68 132 rkastl
        Mode          => standard,
69 133 rkastl
        WordInvalid   => cInactivated,
70 134 rkastl
        Word          => (others => '0'),
71 132 rkastl
        Data          => cDefaultSdData,
72 126 rkastl
        Controller    => cDefaultSdDataToController,
73
        ReadWriteFifo => cDefaultoReadFifo,
74
        WriteReadFifo => cDefaultoWriteFifo,
75 167 rkastl
        DisableSdClk  => cInactivated,
76
        CrcStatus     => (others => '0'));
77 92 rkastl
 
78
        type aCrcOut is record
79
                DataIn  : std_ulogic;
80
                Data    : std_ulogic_vector(3 downto 0);
81
        end record aCrcOut;
82
 
83
        constant cDefaultCrcOut : aCrcOut := (
84
        DataIn => cInactivated,
85
        Data   => (others       => '0'));
86
 
87
        type aCrcIn is record
88
                Correct : std_ulogic_vector(3 downto 0);
89
                Serial  : std_ulogic_vector(3 downto 0);
90
        end record aCrcIn;
91
 
92
        signal CrcIn     : aCrcIn;
93
        signal CrcOut    : aCrcOut;
94
        signal CrcDataIn : std_ulogic_vector(3 downto 0);
95
        signal R, NextR  : aReg;
96
 
97 134 rkastl
        -- aliases for bits, bytes and words from the bit counter
98
        alias RBitC is R.Counter(LogDualis(8)-1 downto 0);
99
        alias RByteC is R.Counter(LogDualis(4)+LogDualis(8)-1 downto LogDualis(8));
100
        alias RWordC is R.Counter(R.Counter'high downto LogDualis(4)+LogDualis(8));
101 136 rkastl
        alias RBitInWordC is R.Counter(LogDualis(32)-1 downto 0);
102 134 rkastl
 
103 92 rkastl
begin
104
 
105 132 rkastl
        -- registered outputs
106
        oData               <= R.Data;
107 92 rkastl
        oSdDataToController <= R.Controller;
108 126 rkastl
        oReadWriteFifo      <= R.ReadWriteFifo;
109
        oWriteReadFifo      <= R.WriteReadFifo;
110 124 rkastl
        oDisableSdClk       <= R.DisableSdClk;
111 92 rkastl
 
112 132 rkastl
 
113 165 rkastl
        Regs : process (iClk)
114 92 rkastl
        begin
115 132 rkastl
                -- clock event
116 165 rkastl
                if (iClk'event and iClk = cActivated) then
117
                        if (iRstSync = cActivated) then
118
                                R <= cDefaultReg;
119
                        else
120
                                -- synchronous enable
121
                                if (iStrobe = cActivated) then
122
                                        R <= NextR;
123
                                end if;
124 132 rkastl
 
125 165 rkastl
                                -- rdreq and wrreq have to be exactly one clock cycle wide
126
                                R.ReadWriteFifo.rdreq <= NextR.ReadWriteFifo.rdreq and iStrobe;
127
                                R.WriteReadFifo.wrreq <= NextR.WriteReadFifo.wrreq and iStrobe;
128
 
129
                                -- Clock has to be disabled before the next strobe is generated
130
                                R.DisableSdClk        <= NextR.DisableSdClk;
131 111 rkastl
                        end if;
132 92 rkastl
                end if;
133
        end process Regs;
134
 
135 132 rkastl
        -- Calculate the next state and output
136 136 rkastl
        Comb : process (iData, iSdDataFromController, CrcIn, iReadWriteFifo, iWriteReadFifo, R)
137 92 rkastl
 
138 133 rkastl
                --------------------------------------------------------------------------------
139 134 rkastl
                -- Handle accessing the fifo
140 133 rkastl
                --------------------------------------------------------------------------------
141 134 rkastl
                procedure HandleFifoAccess (signal status : in std_ulogic; signal req : out std_ulogic) is
142 133 rkastl
                begin
143 134 rkastl
                        if (status = cActivated) then
144
                                -- stop data transfer to card and wait for a change of the fifo status
145
                                report "Fifo not ready, waiting" severity note;
146 133 rkastl
 
147 134 rkastl
                                NextR.DisableSdClk <= cActivated;
148
                                NextR.Counter      <= R.Counter;
149
                                req                <= cInactivated;
150
                        else
151 136 rkastl
                                -- enable request and continue transfer with the sd card
152 134 rkastl
                                NextR.DisableSdClk <= cInactivated;
153
                                req                <= cActivated;
154
                        end if;
155
                end procedure HandleFifoAccess;
156
 
157 133 rkastl
                --------------------------------------------------------------------------------
158 132 rkastl
                -- Set crc outputs so data is shifted in
159 133 rkastl
                --------------------------------------------------------------------------------
160 132 rkastl
                procedure ShiftIntoCrc (constant data : in aSdData) is
161 92 rkastl
                begin
162
                        CrcOut.Data   <= data;
163
                        CrcOut.DataIn <= cActivated;
164 100 rkastl
                end procedure ShiftIntoCrc;
165
 
166 133 rkastl
                --------------------------------------------------------------------------------
167 132 rkastl
                -- Send data to card and calculate crc
168 133 rkastl
                --------------------------------------------------------------------------------
169 132 rkastl
                procedure SendBitsAndShiftIntoCrc (constant data : in aSdData) is
170 100 rkastl
                begin
171
                        ShiftIntoCrc(data);
172 111 rkastl
                        NextR.Data.Data <= data;
173 132 rkastl
                end procedure SendBitsAndShiftIntoCrc;
174 92 rkastl
 
175 132 rkastl
                --------------------------------------------------------------------------------
176 136 rkastl
                -- Calculate the next counter and region
177 132 rkastl
                -- Handles loading next data from fifo or writing data to fifo as well
178
                --------------------------------------------------------------------------------
179
                procedure CalcNextAndHandleData (constant send : boolean) is
180
                        -- End and decrement values for standard mode
181
                        variable BitEnd : integer := 0;
182
                        variable BitDec : integer := 1;
183 113 rkastl
                begin
184 132 rkastl
 
185
                        -- reset variables if wide mode is used
186
                        if R.Mode = wide then
187
                                BitEnd := 3;
188
                                BitDec := 4;
189 126 rkastl
                        end if;
190 134 rkastl
 
191
                        if (RBitC = BitEnd) then
192 136 rkastl
                                -- Byte finished, switch to next byte starting with MSBit
193 134 rkastl
                                NextR.Counter <= R.Counter + (16 - BitDec);
194 113 rkastl
 
195 134 rkastl
                                if (RByteC = 3) then
196 132 rkastl
                                        -- Word finished
197 136 rkastl
                                        NextR.WordInvalid  <= cInactivated; -- received words are no longer invalid
198 113 rkastl
 
199 134 rkastl
                                        if (RWordC = 127) then
200 132 rkastl
                                                -- whole block finished, send crc next
201 134 rkastl
                                                NextR.Region  <= crc;
202
                                                NextR.Counter <= to_unsigned(0, aCounter'length);
203 132 rkastl
 
204
                                        else
205
                                                if (send = true) then
206 136 rkastl
                                                        -- save next word to send from fifo
207 132 rkastl
                                                        NextR.Word <= iReadWriteFifo.q;
208
                                                end if;
209 113 rkastl
                                        end if;
210
                                end if;
211
                        else
212 136 rkastl
                                NextR.Counter <= R.Counter - BitDec; -- switch to next bits (MSBit to LSBit)
213 113 rkastl
                        end if;
214
 
215 132 rkastl
                        if (send = true) then
216 134 rkastl
                                if ((RBitC = BitEnd + BitDec and RByteC = 3 and RWordC < 127)) then
217 136 rkastl
                                        -- current word almost sent, request next word to send from fifo
218 134 rkastl
                                        HandleFifoAccess(iReadWriteFifo.rdempty, NextR.ReadWriteFifo.rdreq);
219 113 rkastl
 
220 132 rkastl
                                end if;
221
                        else
222 157 rkastl
                                if (RByteC = 0 and RBitC = 7 and R.WordInvalid = cInactivated and iSdDataFromController.DisableRb = cInactivated) then
223 136 rkastl
                                        -- received word is valid, save it to ram
224 134 rkastl
                                        NextR.WriteReadFifo.data <= R.Word;
225
                                        HandleFifoAccess(iWriteReadFifo.wrfull, NextR.WriteReadFifo.wrreq);
226 132 rkastl
                                end if;
227
                        end if;
228
                end procedure CalcNextAndHandleData;
229
 
230 133 rkastl
                --------------------------------------------------------------------------------
231
                -- Calculate the bit address in widewidth mode
232
                --------------------------------------------------------------------------------
233 134 rkastl
                impure
234
                function IsBitAddrInRangeWideWidth (constant addr : in natural) return boolean is
235 133 rkastl
                        variable curHighAddr : integer;
236
                begin
237
                        -- calculate current address (of the high bit in case of wide mode)
238 136 rkastl
                        -- widewidth receiving counts from an offset to 4096
239
                        -- and the bit counter is reversed
240 134 rkastl
                        curHighAddr := (127 - to_integer(RWordC)) * 32 + (3 - to_integer(RByteC)) * 8 + to_integer(RBitC);
241 133 rkastl
 
242 134 rkastl
                        if (R.Mode = standard) then
243 133 rkastl
                                return curHighAddr = addr;
244
                        else
245
                                return curHighAddr >= addr and curHighAddr - 3 <= addr;
246
                        end if;
247
                end function IsBitAddrInRangeWideWidth;
248
 
249
                --------------------------------------------------------------------------------
250
                -- Get specific bit from data vector
251
                --------------------------------------------------------------------------------
252
                impure
253
                function GetBitFromData (constant addr : in natural) return std_ulogic is
254
                begin
255
                        if (R.Mode = standard) then
256
                                return iData.Data(0);
257
                        else
258
                                return iData.Data(addr mod 4);
259
                        end if;
260
                end function GetBitFromData;
261
 
262 123 rkastl
                variable temp : std_ulogic_vector(3 downto 0) := "0000";
263 92 rkastl
 
264
        begin
265
 
266 126 rkastl
                -- default assignments
267
                NextR                                         <= R;
268
                NextR.Data.En                                 <= (others => cInactivated);
269
                NextR.Controller                              <= cDefaultSdDataToController;
270
                NextR.Controller.WideMode                     <= R.Controller.WideMode;
271
                NextR.Controller.SpeedBits.HighSpeedSupported <= R.Controller.SpeedBits.HighSpeedSupported;
272
                NextR.Controller.SpeedBits.SwitchFunctionOK   <= R.Controller.SpeedBits.SwitchFunctionOK;
273
                NextR.ReadWriteFifo                           <= cDefaultoReadFifo;
274
                NextR.WriteReadFifo                           <= cDefaultoWriteFifo;
275
                CrcOut                                        <= cDefaultCrcOut;
276
 
277 92 rkastl
                case R.State is
278
                        when idle =>
279 136 rkastl
                                -- check if card signals that it is busy (the controller has to enable this check)
280 147 rkastl
                                if (iSdDataFromController.CheckBusy = cActivated) then
281 167 rkastl
                                        NextR.State <= crcstatus;
282
                                        NextR.Region <= startbit;
283
                                        NextR.Counter <= (others => '0');
284 92 rkastl
 
285 136 rkastl
                                elsif (R.Mode = wide and iData.Data = cSdStartBits) or (R.Mode = standard and iData.Data(0) = cSdStartBit) then
286 132 rkastl
                                        -- start receiving
287 134 rkastl
                                        NextR.Region      <= data;
288
                                        NextR.State       <= receive;
289
                                        NextR.Counter     <= to_unsigned(7,aCounter'length);
290
                                        NextR.WordInvalid <= cActivated;
291 132 rkastl
 
292 136 rkastl
                                        -- which kind of response is expected?
293 100 rkastl
                                        if (iSdDataFromController.DataMode = widewidth) then
294 101 rkastl
                                                if (iSdDataFromController.ExpectBits = ScrBits) then
295 134 rkastl
                                                        NextR.Counter <= to_unsigned(cScrBitsCount, aCounter'length);
296 103 rkastl
                                                elsif (iSdDataFromController.ExpectBits = SwitchFunctionBits) then
297 134 rkastl
                                                        NextR.Counter <= to_unsigned(cSwitchFunctionBitsCount, aCounter'length);
298 101 rkastl
                                                end if;
299 100 rkastl
                                        end if;
300
 
301 134 rkastl
                                elsif (iSdDataFromController.Valid = cActivated) then
302 136 rkastl
                                        -- sending requested by controller
303 132 rkastl
 
304 134 rkastl
                                        case iReadWriteFifo.rdempty is
305
                                                when cActivated =>
306 136 rkastl
                                                        -- no data is available to send -> stall
307 134 rkastl
                                                        report "Fifo empty, waiting for data" severity note;
308
                                                        NextR.DisableSdClk <= cActivated;
309 123 rkastl
 
310 134 rkastl
                                                when cInactivated =>
311 136 rkastl
                                                        -- data is available, start sending
312 134 rkastl
                                                        NextR.State               <= send;
313
                                                        NextR.Region              <= startbit;
314
                                                        NextR.ReadWriteFifo.rdreq <= cActivated;
315
                                                        NextR.DisableSdClk        <= cInactivated;
316
                                                        NextR.Counter             <= to_unsigned(7, aCounter'length);
317
 
318
                                                when others =>
319
                                                        report "rdempty invalid" severity error;
320
                                        end case;
321
                                else
322 136 rkastl
                                        -- switch between standard and wide mode only if nothing else is going on
323 134 rkastl
                                        NextR.Mode <= iSdDataFromController.Mode;
324
                                end if;
325 92 rkastl
 
326 167 rkastl
                        when crcstatus =>
327
                                case R.Region is
328
                                        when startbit =>
329
                                                if (iData.Data(0) = cSdStartBit) then
330
                                                        NextR.Region <= data;
331
                                                end if;
332
 
333
                                        when data =>
334
                                                NextR.CrcStatus(to_integer(R.Counter)) <= iData.Data(0);
335
                                                NextR.Counter <= R.Counter + 1;
336
 
337
                                                if (R.Counter = 2) then
338
                                                        NextR.Region <= endbit;
339
                                                end if;
340
 
341
                                        when endbit =>
342
                                                if (R.CrcStatus /= "010") then
343
                                                        NextR.Controller.Err <= cActivated;
344
                                                        NextR.State <= idle;
345
                                                else
346
                                                        NextR.State <= checkbusy;
347
                                                end if;
348
                                        when others =>
349
                                                report "Invalid state reached" severity error;
350
                                end case;
351
 
352 147 rkastl
                        when checkbusy =>
353
                                NextR.Controller.Busy <= cActivated;
354
 
355
                                if (iData.Data(0) = cActivated) then
356
                                        NextR.Controller.Valid <= cActivated;
357
                                        NextR.State <= idle;
358
                                end if;
359
 
360 134 rkastl
                        when send =>
361 132 rkastl
 
362 134 rkastl
                                -- Handle the data enable signal
363
                                case R.Mode is
364
                                        when wide =>
365
                                                NextR.Data.En <= (others => cActivated);
366 123 rkastl
 
367 134 rkastl
                                        when standard =>
368
                                                NextR.Data.En <= "0001";
369 123 rkastl
 
370 134 rkastl
                                        when others =>
371
                                                report "Invalid SDData mode" severity error;
372
                                                NextR.Data.En <= (others => 'X');
373
                                end case;
374 123 rkastl
 
375 134 rkastl
                                case R.Region is
376
                                        when startbit =>
377
                                                SendBitsAndShiftIntoCrc(cSdStartBits);
378
                                                NextR.Region <= data;
379 123 rkastl
 
380 136 rkastl
                                                -- save data to send from fifo
381 134 rkastl
                                                NextR.Word <= iReadWriteFifo.q;
382 123 rkastl
 
383 134 rkastl
                                        when data =>
384
                                                case R.Mode is
385
                                                        when wide =>
386
                                                                for i in 0 to 3 loop
387 150 rkastl
                                                                        temp(3 - i) := R.Word(to_integer(RBitInWordC) - i);
388 134 rkastl
                                                                end loop;
389 123 rkastl
 
390 134 rkastl
                                                        when standard =>
391 136 rkastl
                                                                temp := "---" & R.Word(to_integer(RBitInWordC));
392 123 rkastl
 
393 134 rkastl
                                                        when others =>
394
                                                                temp := "XXXX";
395
                                                end case;
396 123 rkastl
 
397 134 rkastl
                                                SendBitsAndShiftIntoCrc(temp);
398
                                                CalcNextAndHandleData(true);
399
 
400
                                        when crc =>
401
                                                NextR.Data.Data <= CrcIn.Serial;
402
 
403
                                                if (R.Counter = 15) then
404 132 rkastl
                                                -- all crc bits sent
405 134 rkastl
                                                        NextR.Counter        <= to_unsigned(0, aCounter'length);
406
                                                        NextR.Region         <= endbit;
407
                                                        NextR.Controller.Ack <= cActivated;
408 123 rkastl
 
409 134 rkastl
                                                else
410
                                                        NextR.Counter <= R.Counter + 1;
411
                                                end if;
412 123 rkastl
 
413 134 rkastl
                                        when endbit =>
414
                                                NextR.Data.Data <= cSdEndBits;
415
                                                NextR.State     <= idle;
416 123 rkastl
 
417 134 rkastl
                                        when others =>
418
                                                report "Region not handled" severity error;
419
                                end case;
420 123 rkastl
 
421 134 rkastl
                        when receive =>
422
                                case R.Region is
423
                                        when data =>
424
                                                -- save received data to temporary word register
425
                                                case R.Mode is
426
                                                        when standard =>
427 136 rkastl
                                                                NextR.Word(to_integer(RBitInWordC)) <= iData.Data(0);
428 100 rkastl
 
429 134 rkastl
                                                        when wide =>
430
                                                                for i in 0 to 3 loop
431 136 rkastl
                                                                        NextR.Word(to_integer(RBitInWordC) - i) <= iData.Data(3 - i);
432 134 rkastl
                                                                end loop;
433 113 rkastl
 
434 134 rkastl
                                                        when others =>
435
                                                                report "Unhandled mode" severity error;
436
                                                end case;
437 113 rkastl
 
438 134 rkastl
                                                ShiftIntoCrc(std_ulogic_vector(iData.Data));
439
                                                CalcNextAndHandleData(false);
440 132 rkastl
 
441 136 rkastl
                                                -- check responses 
442 134 rkastl
                                                if (iSdDataFromController.DataMode = widewidth) then
443
                                                        if (iSdDataFromController.ExpectBits = ScrBits) then
444
                                                                if (IsBitAddrInRangeWideWidth(cWideModeBitAddr)) then
445
                                                                        NextR.Controller.WideMode <= GetBitFromData(cWideModeBitAddr);
446
                                                                end if;
447 133 rkastl
                                                        end if;
448 126 rkastl
 
449 134 rkastl
                                                        if (iSdDataFromController.ExpectBits = SwitchFunctionBits) then
450
                                                                if (IsBitAddrInRangeWideWidth(cHighSpeedBitAddr)) then
451
                                                                        NextR.Controller.SpeedBits.HighSpeedSupported <= GetBitFromData(cHighSpeedBitAddr);
452
                                                                elsif (IsBitAddrInRangeWideWidth(cSwitchFunctionBitLowAddr)) then
453
                                                                        NextR.Controller.SpeedBits.SwitchFunctionOK <= iData.Data;
454
                                                                end if;
455 133 rkastl
                                                        end if;
456
                                                end if;
457 100 rkastl
 
458 134 rkastl
                                        when crc =>
459 136 rkastl
                                                -- save last word to ram
460 134 rkastl
                                                ShiftIntoCrc(std_ulogic_vector(iData.Data));
461 100 rkastl
 
462 134 rkastl
                                                if (R.Counter = 15) then
463 157 rkastl
                                                        -- all 16 crc bits received
464 134 rkastl
                                                        NextR.Region <= endbit;
465
                                                else
466
                                                        NextR.Counter <= R.Counter + 1;
467 157 rkastl
 
468
                                                        if (R.Counter = 0 and iSdDataFromController.DisableRb = cInactivated) then
469
                                                                HandleFifoAccess(iWriteReadFifo.wrfull, NextR.WriteReadFifo.wrreq);
470
                                                                NextR.WriteReadFifo.data <= R.Word;
471
                                                        end if;
472 134 rkastl
                                                end if;
473 100 rkastl
 
474 134 rkastl
                                        when endbit =>
475 136 rkastl
                                                -- in standard mode all unused crcs are correct, because no data was shifted in
476 134 rkastl
                                                if (CrcIn.Correct = "1111") then
477
                                                        NextR.Controller.Valid <= cActivated;
478
                                                else
479
                                                        NextR.Controller.Err <= cActivated;
480
                                                end if;
481 101 rkastl
 
482 134 rkastl
                                                NextR.Region <= startbit;
483
                                                NextR.State  <= idle;
484 100 rkastl
 
485 134 rkastl
                                        when others =>
486
                                                report "Region not handled" severity error;
487
                                end case;
488 100 rkastl
 
489 134 rkastl
                        when others =>
490
                                report "State not handled" severity error;
491
                end case;
492 92 rkastl
 
493 134 rkastl
        end process Comb;
494 92 rkastl
 
495 136 rkastl
        CrcDataIn <= (others => CrcOut.DataIn) when R.Mode = wide else "000" & CrcOut.DataIn;
496 92 rkastl
 
497 134 rkastl
        crcs: for idx in 3 downto 0 generate
498 132 rkastl
 
499 134 rkastl
                CRC_inst : entity work.Crc
500
                generic map (
501
                        gPolynom => crc16
502
                )
503
                port map (
504
                        iClk         => iClk,
505 165 rkastl
                        iRstSync     => iRstSync,
506 134 rkastl
                        iStrobe      => iStrobe,
507 165 rkastl
                        iClear           => cInactivated,
508 134 rkastl
                        iDataIn      => CrcDataIn(idx),
509
                        iData        => CrcOut.Data(idx),
510
                        oIsCorrect   => CrcIn.Correct(idx),
511
                        oSerial      => CrcIn.Serial(idx)
512
                );
513 105 rkastl
 
514 134 rkastl
        end generate crcs;
515 105 rkastl
 
516 92 rkastl
end architecture Rtl;
517
 

powered by: WebSVN 2.1.0

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