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

Subversion Repositories iso7816_3_master

[/] [iso7816_3_master/] [trunk/] [sources/] [RxCore.v] - Blame information for rev 5

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 4 acapola
`timescale 1ns / 1ps
2
`default_nettype none
3 2 acapola
//////////////////////////////////////////////////////////////////////////////////
4
// Company: 
5
// Engineer: Sebastien Riou
6
// 
7
// Create Date:    23:57:02 08/31/2010 
8
// Design Name: 
9
// Module Name:    RxCore 
10
// Project Name: 
11
// Target Devices: 
12
// Tool versions: 
13
// Description: 
14
//
15
// Dependencies: 
16
//
17
// Revision: 
18
// Revision 0.01 - File Created
19
// Additional Comments: 
20
//
21
//////////////////////////////////////////////////////////////////////////////////
22
module RxCore(
23
   output reg [7:0] dataOut,
24
   output reg overrunErrorFlag, //new data has been received before dataOut was read
25
   output reg dataOutReadyFlag, //new data available
26
   output reg frameErrorFlag,           //bad parity or bad stop bits
27
   output reg endOfRx,                          //one cycle pulse: 1 during last cycle of last stop bit
28
   output reg run,                                      //rx is definitely started, one of the three flag will be set
29 5 acapola
   output wire startBit,                        //rx is started, but we don't know yet if real rx or just a glitch
30
        output wire stopBit,                            //rx is over but still in stop bits
31 4 acapola
        input wire [CLOCK_PER_BIT_WIDTH-1:0] clocksPerBit,
32
        input wire stopBit2,//0: 1 stop bit, 1: 2 stop bits
33
        input wire oddParity, //if 1, parity bit is such that data+parity have an odd number of 1
34
   input wire msbFirst,  //if 1, bits order is: startBit, b7, b6, b5...b0, parity
35
        input wire ackFlags,
36
        input wire serialIn,
37
        input wire clk,
38
   input wire nReset,
39 2 acapola
        //to connect to an instance of Counter.v (see RxCoreSelfContained.v for example)
40
        output reg [CLOCK_PER_BIT_WIDTH-1:0] bitClocksCounterCompare,
41
        output reg bitClocksCounterInc,
42
        output reg bitClocksCounterClear,
43 4 acapola
        output wire bitClocksCounterInitVal,
44
   input wire bitClocksCounterEarlyMatch,
45
        input wire bitClocksCounterMatch
46 2 acapola
    );
47
 
48
//parameters to override
49
parameter CLOCK_PER_BIT_WIDTH = 13;     //allow to support default speed of ISO7816
50 5 acapola
 
51 2 acapola
//default conventions
52
parameter START_BIT = 1'b0;
53
parameter STOP_BIT1 = 1'b1;
54
parameter STOP_BIT2 = 1'b1;
55
 
56
//constant definition for states
57
localparam IDLE_STATE =         3'b000;
58
localparam START_STATE =        3'b001;
59
localparam DATA_STATE =         3'b011;
60
localparam PARITY_STATE =       3'b010;
61
localparam STOP1_STATE =        3'b110;
62
localparam STOP2_STATE =        3'b111;
63
localparam END_STATE =          3'b101;
64
localparam END2_STATE =    3'b100;
65
 
66
localparam IDLE_BIT = ~START_BIT;
67
 
68
reg [2:0] nextState;
69
 
70
reg [2:0] bitCounter;
71
wire [2:0] bitIndex = msbFirst ? 7-bitCounter : bitCounter;
72
reg parityBit;
73
 
74
wire internalIn;
75
wire parityError;
76
 
77 5 acapola
assign startBit = (nextState == START_STATE);
78
assign stopBit = (nextState == STOP1_STATE) | (nextState == STOP2_STATE);
79 2 acapola
assign internalIn = serialIn;
80
assign parityError= parityBit ^ internalIn ^ 1'b1;
81
reg flagsSet;
82
 
83
assign bitClocksCounterInitVal=(nextState==IDLE_STATE);
84
always @(nextState, clocksPerBit, run, bitClocksCounterMatch) begin
85
        case(nextState)
86
                IDLE_STATE: begin
87
                        bitClocksCounterCompare = (clocksPerBit/2);
88
                        bitClocksCounterInc = run & ~bitClocksCounterMatch;//stop when reach 0
89
                        bitClocksCounterClear = ~run;
90
                end
91
                START_STATE: begin
92
                        bitClocksCounterCompare = (clocksPerBit/2);
93
                        bitClocksCounterInc = 1;
94
                        bitClocksCounterClear = 0;
95
                end
96
                STOP2_STATE: begin
97
         //make the rx operation is one cycle shorter, 
98
         //since we detect the start bit at least one cycle later it starts.
99
                        bitClocksCounterCompare = clocksPerBit-1;
100
                        bitClocksCounterInc = 1;
101
                        bitClocksCounterClear = 0;
102
                end
103
                default: begin
104
                        bitClocksCounterCompare = clocksPerBit;
105
                        bitClocksCounterInc = 1;
106
                        bitClocksCounterClear = 0;
107
                end
108
        endcase
109
end
110
 
111
always @(posedge clk, negedge nReset) begin
112
        if(~nReset) begin
113
                nextState <= #1 IDLE_STATE;
114
                bitCounter <= #1 0;
115
                parityBit <= #1 0;
116
                overrunErrorFlag <= #1 0;
117
                dataOutReadyFlag <= #1 0;
118
                frameErrorFlag <= #1 0;
119
                run <= #1 0;
120
      endOfRx <= #1 0;
121
        end else begin
122
                case(nextState)
123
                        IDLE_STATE: begin
124
                                if(bitClocksCounterEarlyMatch)
125
               endOfRx <= #1 1'b1;
126
            if(bitClocksCounterMatch)
127
               endOfRx <= #1 0;
128
            if(ackFlags) begin
129
                                        //overrunErrorFlag is auto cleared at PARITY_STATE
130
                                        //meanwhile, it prevent dataOutReadyFlag to be set by the termination of the lost byte
131
                                        dataOutReadyFlag <= #1 0;
132
                                        frameErrorFlag <= #1 0;
133
                                end
134
                                if(START_BIT == internalIn) begin
135
                                        if(frameErrorFlag | overrunErrorFlag) begin
136
                                                //wait clear from outside
137
                                                if(bitClocksCounterMatch) begin
138
                     //endOfRx <= #1 0;
139
                                                        run <= #1 0;
140
                  end
141
                                        end else begin
142
                                                parityBit <= #1 oddParity;
143
                                                run <= #1 0;
144
                                                nextState <= #1 START_STATE;
145
                                        end
146
                                end else begin
147
                                        if(bitClocksCounterMatch) begin
148
                  //endOfRx <= #1 0;
149
                                                run <= #1 0;
150
               end
151
                                end
152
                        end
153
                        START_STATE: begin
154
                                if(ackFlags) begin
155
                                        dataOutReadyFlag <= #1 0;
156
                                        frameErrorFlag <= #1 0;
157
                                end
158
                                if(bitClocksCounterMatch) begin
159
                                        if(START_BIT != internalIn) begin
160
                                                nextState <= #1 IDLE_STATE;
161
                                        end else begin
162
                                                run <= #1 1;
163
                                                nextState <= #1 DATA_STATE;
164
                                        end
165
                                end
166
                        end
167
                        DATA_STATE: begin
168
                                if(ackFlags) begin
169
                                        dataOutReadyFlag <= #1 0;
170
                                        frameErrorFlag <= #1 0;
171
                                end
172
                                if(bitClocksCounterMatch) begin
173
                                        if(dataOutReadyFlag) begin
174
                                                overrunErrorFlag <= #1 1;
175
                                        end else
176
                                                dataOut[bitIndex] <= #1 internalIn;
177
                                        parityBit <= #1 parityBit ^ internalIn;
178
                                        bitCounter <= #1 (bitCounter + 1'b1) & 3'b111;
179
                                        if(bitCounter == 7)
180
                                                nextState <= #1 PARITY_STATE;
181
                                end
182
                        end
183
                        PARITY_STATE: begin
184
                                if(bitClocksCounterMatch) begin
185
                                        if(~overrunErrorFlag) begin
186
                                                frameErrorFlag <= #1 parityError;
187
                                                dataOutReadyFlag <= #1 ~parityError;
188
                                        end else if(ackFlags) begin
189
                                                frameErrorFlag <= #1 0;
190
                                        end
191
                                        flagsSet=1;
192
                                        if(stopBit2)
193
                                                nextState <= #1 STOP1_STATE;
194
                                        else
195
                                                nextState <= #1 STOP2_STATE;
196
                                end else if(ackFlags) begin
197
                                        dataOutReadyFlag <= #1 0;
198
                                        frameErrorFlag <= #1 0;
199
                                end
200
                        end
201
                        STOP1_STATE: begin
202
                                if(ackFlags) begin
203
                                        dataOutReadyFlag <= #1 0;
204
                                end
205
                                if(bitClocksCounterMatch) begin
206
                                        if(STOP_BIT1 != internalIn) begin
207
                                                frameErrorFlag <= #1 parityError;
208
                                        end else if(ackFlags) begin
209
                                                frameErrorFlag <= #1 0;
210
                                        end
211
                                        nextState <= #1 STOP2_STATE;
212
                                end else if(ackFlags) begin
213
                                        frameErrorFlag <= #1 0;
214
                                end
215
                        end
216
                        STOP2_STATE: begin
217
                                if(ackFlags) begin
218
                                        dataOutReadyFlag <= #1 0;
219
                                end
220
            if(bitClocksCounterMatch) begin
221
                                        if(STOP_BIT2 != internalIn) begin
222
                                                frameErrorFlag <= #1 1;
223
                                        end else if(ackFlags) begin
224
                                                frameErrorFlag <= #1 0;
225
                                        end
226
                                        nextState <= #1 IDLE_STATE;
227
                                end else if(ackFlags) begin
228
                                        frameErrorFlag <= #1 0;
229
                                end
230
                        end
231
                        default: nextState <= #1 IDLE_STATE;
232
                endcase
233
        end
234
end
235
 
236
endmodule

powered by: WebSVN 2.1.0

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