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 6

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
        output reg [7:0] lastByte
38
        );
39 6 acapola
parameter DIVIDER_WIDTH = 1;
40 5 acapola
 
41
reg [8:0] tsCnt;//counter to start ATR 400 cycles after reset release
42
 
43
reg [7:0] buffer[256+5:0];
44
localparam CLA_I= 8*4;
45
localparam INS_I= 8*3;
46
localparam P1_I = 8*2;
47
localparam P2_I = 8*1;
48
localparam P3_I = 0;
49
reg [CLA_I+7:0] tpduHeader;
50
 
51 6 acapola
//wire COM_statusOut=statusOut;
52 5 acapola
wire COM_clk=isoClk;
53
integer COM_errorCnt;
54 6 acapola
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 6 acapola
reg nCsDataOut;
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 5 acapola
`include "ComRxDriverTasks.v"
72
 
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
                .CLOCK_PER_BIT_WIDTH(4'd13))
80 5 acapola
        rxCore (
81
    .dataOut(rxData),
82
    .overrunErrorFlag(overrunError),
83
    .dataOutReadyFlag(bufferFull),
84
    .frameErrorFlag(frameError),
85
    .endOfRx(endOfRx),
86
    .run(rxRun),
87
    .startBit(rxStartBit),
88
         .stopBit(guardTime),
89
    .clkPerCycle(clkPerCycle),
90
    .clocksPerBit(cyclesPerEtu),
91
    .stopBit2(stopBit2),
92
    .oddParity(oddParity),
93
    .msbFirst(msbFirst),
94
         .ackFlags(nCsDataOut),
95
    .serialIn(isoSio),
96 6 acapola
    .comClk(isoClk),
97 5 acapola
    .clk(clk),
98
    .nReset(nReset)
99
    );
100
 
101
TsAnalyzer tsAnalyzer(
102
        .nReset(nReset),
103
        .isoReset(isoReset),
104
        .isoClk(isoClk),
105
        .isoVdd(isoVdd),
106
        .isoSio(isoSio),
107
        .endOfRx(endOfRx),
108
        .rxData(rxData),
109
        .isActivated(isActivated),
110
        .tsReceived(tsReceived),
111
        .tsError(tsError),
112
        .atrIsEarly(atrIsEarly),
113
        .atrIsLate(atrIsLate),
114
        .useIndirectConvention(useIndirectConvention)
115
        );
116
 
117
FiDiAnalyzer fiDiAnalyzer(
118
        .fiCode(fiCode),
119
        .diCode(diCode),
120
        .fi(fi),
121
        .di(di),
122
        .cyclesPerEtu(cyclesPerEtu),
123
        .fMax(fMax)
124
        );
125
 
126
wire run = rxStartBit | rxRun;
127 6 acapola
localparam ATR_T0 = 0;
128
localparam ATR_TDI = 1;
129
localparam ATR_HISTORICAL = 2;
130
localparam ATR_TCK = 3;
131
localparam T0_HEADER = 0;
132
localparam T0_PB = 0;
133
localparam T0_DATA = 0;
134
integer fsmState;
135
 
136
reg [11:0] tdiStruct;
137
wire [3:0] tdiCnt;//i+1
138
wire [7:0] tdiData;//value of TDi
139
assign {tdiCnt,tdiData}=tdiStruct;
140
 
141
wire [1:0] nIfBytes;
142
HammingWeight hammingWeight(.dataIn(tdiData[7:4]), .hammingWeight(nIfBytes));
143
reg [7:0] bytesCnt;
144
 
145
always @(posedge isoClk, negedge nReset) begin
146 5 acapola
        if(~nReset) begin
147
                fiCode<=4'b0001;
148
                diCode<=4'b0001;
149 6 acapola
                useT0<=1'b1;
150 5 acapola
                useT1<=1'b0;
151
                useT15<=1'b0;
152
                waitCardTx<=1'b0;
153
                waitTermTx<=1'b0;
154
                lastByte<=8'b0;
155 6 acapola
                fsmState<=ATR_TDI;
156
                atrHasTck<=1'b0;
157
                bytesCnt<=8'h0;
158
                tdiStruct<=12'h0;
159
                atrCompleted<=1'b0;
160 5 acapola
        end else if(isActivated) begin
161
                if(~tsReceived) begin
162
                        waitCardTx<=1'b1;
163
                end else if(~atrCompleted) begin
164 6 acapola
                        //ATR analysis
165
                        case(fsmState)
166
                                ATR_TDI: begin
167
                                        if(endOfRx) begin
168
                                                if(bytesCnt==nIfBytes) begin //TDi bytes
169
                                                        bytesCnt <= 2'h0;
170
                                                        tdiStruct <= {tdiCnt+1,dataOut};
171
                                                        if(4'h0==tdiCnt) begin//this is T0
172
                                                                atrK <= dataOut[3:0];
173
                                                                fsmState <= (4'b0!=dataOut[7:4]) ? ATR_TDI :
174
                                                                                                (4'b0!=dataOut[3:0]) ? ATR_HISTORICAL : T0_HEADER;
175
                                                        end else begin//TDi, i from 1 to 15
176
                                                                fsmState <= (4'b0!=dataOut[7:4]) ? ATR_TDI :
177
                                                                                                (4'b0!=atrK) ? ATR_HISTORICAL : T0_HEADER;
178
                                                        end
179
                                                end else begin //TA, TB or TC bytes
180
                                                        //TODO: get relevant info
181
                                                        bytesCnt <= bytesCnt+1;
182
                                                end
183
                                        end
184
                                end
185
                                ATR_HISTORICAL: begin
186
                                        if(endOfRx) begin
187
                                                if(bytesCnt==atrK) begin
188
                                                        atrCompleted <= ~atrHasTck;
189
                                                        fsmState <= atrHasTck ? ATR_TCK : T0_HEADER;
190
                                                end else begin
191
                                                        bytesCnt <= bytesCnt+1;
192
                                                end
193
                                        end
194
                                end
195
                                ATR_TCK: begin
196
                                        if(endOfRx) begin
197
                                        //TODO:check
198
                                                atrCompleted <= 1'b1;
199
                                                fsmState <= T0_HEADER;
200
                                        end
201
                                end
202
                        endcase
203 5 acapola
                end else if(useT0) begin
204
                        //T=0 cmd/response monitoring state machine
205
 
206
 
207
                end
208
        end
209
end
210
 
211
reg [1:0] txDir;
212
always @(*) begin: errorSigDirectionBlock
213 6 acapola
        if(guardTime & ~isoSio)
214
                {cardTx, termTx}={txDir[0],txDir[1]};
215 5 acapola
        else
216 6 acapola
                {cardTx, termTx}={txDir[1],txDir[0]};
217 5 acapola
end
218 6 acapola
always @(posedge isoClk, negedge nReset) begin: comDirectionBlock
219 5 acapola
        if(~nReset | ~run) begin
220
                txDir<=2'b00;
221
        end else begin
222 6 acapola
                if(~guardTime) begin //{waitCardTx, waitTermTx} is updated during stop bits so we hold current value here
223 5 acapola
                        case({waitCardTx, waitTermTx})
224
                                2'b00: txDir<=2'b00;
225
                                2'b01: txDir<=2'b01;
226
                                2'b10: txDir<=2'b10;
227
                                2'b11: txDir<=2'b00;
228
                        endcase
229
                end
230
        end
231
end
232
 
233
endmodule
234
 

powered by: WebSVN 2.1.0

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