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

Subversion Repositories iso7816_3_master

[/] [iso7816_3_master/] [trunk/] [test/] [iso7816_3_t0_analyzer.v] - Blame information for rev 7

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

Line No. Rev Author Line
1 5 acapola
`timescale 1ns / 1ps
2
`default_nettype none
3
 
4
module Iso7816_3_t0_analyzer(
5
        input wire nReset,
6
        input wire clk,
7 6 acapola
        input wire [DIVIDER_WIDTH-1:0] clkPerCycle,
8 5 acapola
        input wire isoReset,
9
        input wire isoClk,
10
        input wire isoVdd,
11
        input wire isoSio,
12
        output reg [3:0] fiCode,
13
        output reg [3:0] diCode,
14 6 acapola
        output wire [12:0] fi,
15
        output wire [7:0] di,
16
        output wire [12:0] cyclesPerEtu,
17
        output wire [7:0] fMax,
18 5 acapola
        output wire isActivated,
19
        output wire tsReceived,
20
        output wire tsError,
21
        output wire useIndirectConvention,
22
        output wire atrIsEarly,//high if TS received before 400 cycles after reset release
23
        output wire atrIsLate,//high if TS is still not received after 40000 cycles after reset release
24 6 acapola
        output reg [3:0] atrK,//number of historical bytes
25
        output reg atrHasTck,
26
        output reg atrCompleted,
27 5 acapola
        output reg useT0,
28
        output reg useT1,
29
        output reg useT15,
30
        output reg waitCardTx,
31
        output reg waitTermTx,
32 6 acapola
        output reg cardTx,
33
        output reg termTx,
34 5 acapola
        output wire guardTime,
35
        output wire overrunError,
36
        output wire frameError,
37 7 acapola
        output reg [7:0] lastByte,
38
        output reg [31:0] bytesCnt
39 5 acapola
        );
40 6 acapola
parameter DIVIDER_WIDTH = 1;
41 5 acapola
 
42
reg [8:0] tsCnt;//counter to start ATR 400 cycles after reset release
43
 
44
reg [7:0] buffer[256+5:0];
45
localparam CLA_I= 8*4;
46
localparam INS_I= 8*3;
47
localparam P1_I = 8*2;
48
localparam P2_I = 8*1;
49
localparam P3_I = 0;
50
reg [CLA_I+7:0] tpduHeader;
51
 
52 7 acapola
//wire COM_clk=isoClk;
53
//integer COM_errorCnt;
54
//wire txPending=1'b0;
55
//wire txRun=1'b0;
56 5 acapola
 
57
wire rxRun, rxStartBit, overrunErrorFlag, frameErrorFlag, bufferFull;
58
assign overrunErrorFlag = overrunError;
59
assign frameErrorFlag = frameError;
60
 
61
wire [7:0] rxData;
62 7 acapola
reg ackFlags;
63 5 acapola
 
64 6 acapola
wire msbFirst = useIndirectConvention;
65
wire sioHighValue = ~useIndirectConvention;
66
wire oddParity = 1'b0;
67
 
68
wire [7:0] dataOut = sioHighValue ? rxData : ~rxData;
69
 
70
 
71 7 acapola
//`include "ComRxDriverTasks.v"
72 5 acapola
 
73
wire endOfRx;
74
 
75 6 acapola
wire stopBit2 = useT0;//1 if com use 2 stop bits --> 12 ETU / byte
76 5 acapola
 
77
RxCoreSelfContained #(
78 6 acapola
                .DIVIDER_WIDTH(DIVIDER_WIDTH),
79 7 acapola
                .CLOCK_PER_BIT_WIDTH(4'd13),
80
                .PRECISE_STOP_BIT(1'b1))
81 5 acapola
        rxCore (
82
    .dataOut(rxData),
83
    .overrunErrorFlag(overrunError),
84
    .dataOutReadyFlag(bufferFull),
85
    .frameErrorFlag(frameError),
86
    .endOfRx(endOfRx),
87
    .run(rxRun),
88
    .startBit(rxStartBit),
89
         .stopBit(guardTime),
90
    .clkPerCycle(clkPerCycle),
91 7 acapola
    .clocksPerBit(cyclesPerEtu-1),
92 5 acapola
    .stopBit2(stopBit2),
93
    .oddParity(oddParity),
94
    .msbFirst(msbFirst),
95 7 acapola
         .ackFlags(ackFlags),
96 5 acapola
    .serialIn(isoSio),
97 6 acapola
    .comClk(isoClk),
98 5 acapola
    .clk(clk),
99
    .nReset(nReset)
100
    );
101
 
102
TsAnalyzer tsAnalyzer(
103
        .nReset(nReset),
104
        .isoReset(isoReset),
105
        .isoClk(isoClk),
106
        .isoVdd(isoVdd),
107
        .isoSio(isoSio),
108
        .endOfRx(endOfRx),
109
        .rxData(rxData),
110
        .isActivated(isActivated),
111
        .tsReceived(tsReceived),
112
        .tsError(tsError),
113
        .atrIsEarly(atrIsEarly),
114
        .atrIsLate(atrIsLate),
115
        .useIndirectConvention(useIndirectConvention)
116
        );
117
 
118
FiDiAnalyzer fiDiAnalyzer(
119
        .fiCode(fiCode),
120
        .diCode(diCode),
121
        .fi(fi),
122
        .di(di),
123
        .cyclesPerEtu(cyclesPerEtu),
124
        .fMax(fMax)
125
        );
126
 
127
wire run = rxStartBit | rxRun;
128 6 acapola
localparam ATR_T0 = 0;
129
localparam ATR_TDI = 1;
130
localparam ATR_HISTORICAL = 2;
131
localparam ATR_TCK = 3;
132
localparam T0_HEADER = 0;
133
localparam T0_PB = 0;
134
localparam T0_DATA = 0;
135
integer fsmState;
136
 
137
reg [11:0] tdiStruct;
138
wire [3:0] tdiCnt;//i+1
139
wire [7:0] tdiData;//value of TDi
140
assign {tdiCnt,tdiData}=tdiStruct;
141
 
142
wire [1:0] nIfBytes;
143
HammingWeight hammingWeight(.dataIn(tdiData[7:4]), .hammingWeight(nIfBytes));
144 7 acapola
reg [7:0] tempBytesCnt;
145 6 acapola
always @(posedge isoClk, negedge nReset) begin
146 5 acapola
        if(~nReset) begin
147 7 acapola
                lastByte<=8'b0;
148
                ackFlags<=1'b0;
149
                bytesCnt<=32'b0;
150
        end else if(ackFlags) begin
151
                ackFlags<=1'b0;
152
        end else if(frameErrorFlag|bufferFull) begin
153
                lastByte<=dataOut;
154
                ackFlags<=1'b1;
155
                bytesCnt<=bytesCnt+1'b1;
156
        end
157
end
158
always @(posedge isoClk, negedge nReset) begin
159
        if(~nReset) begin
160 5 acapola
                fiCode<=4'b0001;
161
                diCode<=4'b0001;
162 6 acapola
                useT0<=1'b1;
163 5 acapola
                useT1<=1'b0;
164
                useT15<=1'b0;
165
                waitCardTx<=1'b0;
166
                waitTermTx<=1'b0;
167 6 acapola
                fsmState<=ATR_TDI;
168
                atrHasTck<=1'b0;
169 7 acapola
                tempBytesCnt<=8'h0;
170 6 acapola
                tdiStruct<=12'h0;
171
                atrCompleted<=1'b0;
172 5 acapola
        end else if(isActivated) begin
173
                if(~tsReceived) begin
174
                        waitCardTx<=1'b1;
175
                end else if(~atrCompleted) begin
176 6 acapola
                        //ATR analysis
177
                        case(fsmState)
178
                                ATR_TDI: begin
179
                                        if(endOfRx) begin
180 7 acapola
                                                if(tempBytesCnt==nIfBytes) begin //TDi bytes
181
                                                        tempBytesCnt <= 2'h0;
182 6 acapola
                                                        tdiStruct <= {tdiCnt+1,dataOut};
183
                                                        if(4'h0==tdiCnt) begin//this is T0
184
                                                                atrK <= dataOut[3:0];
185
                                                                fsmState <= (4'b0!=dataOut[7:4]) ? ATR_TDI :
186
                                                                                                (4'b0!=dataOut[3:0]) ? ATR_HISTORICAL : T0_HEADER;
187
                                                        end else begin//TDi, i from 1 to 15
188
                                                                fsmState <= (4'b0!=dataOut[7:4]) ? ATR_TDI :
189
                                                                                                (4'b0!=atrK) ? ATR_HISTORICAL : T0_HEADER;
190
                                                        end
191
                                                end else begin //TA, TB or TC bytes
192
                                                        //TODO: get relevant info
193 7 acapola
                                                        tempBytesCnt <= tempBytesCnt+1;
194 6 acapola
                                                end
195
                                        end
196
                                end
197
                                ATR_HISTORICAL: begin
198
                                        if(endOfRx) begin
199 7 acapola
                                                if(tempBytesCnt==atrK) begin
200 6 acapola
                                                        atrCompleted <= ~atrHasTck;
201
                                                        fsmState <= atrHasTck ? ATR_TCK : T0_HEADER;
202
                                                end else begin
203 7 acapola
                                                        tempBytesCnt <= tempBytesCnt+1;
204 6 acapola
                                                end
205
                                        end
206
                                end
207
                                ATR_TCK: begin
208
                                        if(endOfRx) begin
209
                                        //TODO:check
210
                                                atrCompleted <= 1'b1;
211
                                                fsmState <= T0_HEADER;
212
                                        end
213
                                end
214
                        endcase
215 5 acapola
                end else if(useT0) begin
216
                        //T=0 cmd/response monitoring state machine
217
 
218
 
219
                end
220
        end
221
end
222
 
223
reg [1:0] txDir;
224
always @(*) begin: errorSigDirectionBlock
225 6 acapola
        if(guardTime & ~isoSio)
226
                {cardTx, termTx}={txDir[0],txDir[1]};
227 5 acapola
        else
228 6 acapola
                {cardTx, termTx}={txDir[1],txDir[0]};
229 5 acapola
end
230 6 acapola
always @(posedge isoClk, negedge nReset) begin: comDirectionBlock
231 5 acapola
        if(~nReset | ~run) begin
232
                txDir<=2'b00;
233
        end else begin
234 6 acapola
                if(~guardTime) begin //{waitCardTx, waitTermTx} is updated during stop bits so we hold current value here
235 5 acapola
                        case({waitCardTx, waitTermTx})
236
                                2'b00: txDir<=2'b00;
237
                                2'b01: txDir<=2'b01;
238
                                2'b10: txDir<=2'b10;
239
                                2'b11: txDir<=2'b00;
240
                        endcase
241
                end
242
        end
243
end
244
 
245
endmodule
246
 

powered by: WebSVN 2.1.0

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