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 5

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
        input wire isoReset,
8
        input wire isoClk,
9
        input wire isoVdd,
10
        input wire isoSio,
11
        output reg [3:0] fiCode,
12
        output reg [3:0] diCode,
13
        output reg [3:0] fi,
14
        output reg [3:0] di,
15
        output reg [12:0] cyclesPerEtu,
16
        output reg [7:0] fMax,
17
        output wire isActivated,
18
        output wire tsReceived,
19
        output wire tsError,
20
        output wire useIndirectConvention,
21
        output wire atrIsEarly,//high if TS received before 400 cycles after reset release
22
        output wire atrIsLate,//high if TS is still not received after 40000 cycles after reset release
23
        output wire atrCompleted,
24
        output reg useT0,
25
        output reg useT1,
26
        output reg useT15,
27
        output reg waitCardTx,
28
        output reg waitTermTx,
29
        output wire cardTx,
30
        output wire termTx,
31
        output wire guardTime,
32
        output wire overrunError,
33
        output wire frameError,
34
        output reg [7:0] lastByte
35
        );
36
 
37
 
38
reg [8:0] tsCnt;//counter to start ATR 400 cycles after reset release
39
 
40
reg [7:0] buffer[256+5:0];
41
localparam CLA_I= 8*4;
42
localparam INS_I= 8*3;
43
localparam P1_I = 8*2;
44
localparam P2_I = 8*1;
45
localparam P3_I = 0;
46
reg [CLA_I+7:0] tpduHeader;
47
 
48
wire COM_statusOut=statusOut;
49
wire COM_clk=isoClk;
50
integer COM_errorCnt;
51
 
52
wire rxRun, rxStartBit, overrunErrorFlag, frameErrorFlag, bufferFull;
53
assign overrunErrorFlag = overrunError;
54
assign frameErrorFlag = frameError;
55
 
56
wire [7:0] rxData;
57
wire nCsDataOut;
58
 
59
`include "ComRxDriverTasks.v"
60
 
61
wire endOfRx;
62
 
63
wire msbFirst = useIndirectConvention;
64
wire sioHighValue = ~useIndirectConvention;
65
wire oddParity = 1'b0;
66
 
67
wire plainRxData = sioHighValue ? rxData : ~rxData;
68
 
69
RxCoreSelfContained #(
70
                .DIVIDER_WIDTH(4'd13))
71
        rxCore (
72
    .dataOut(rxData),
73
    .overrunErrorFlag(overrunError),
74
    .dataOutReadyFlag(bufferFull),
75
    .frameErrorFlag(frameError),
76
    .endOfRx(endOfRx),
77
    .run(rxRun),
78
    .startBit(rxStartBit),
79
         .stopBit(guardTime),
80
    .clkPerCycle(clkPerCycle),
81
    .clocksPerBit(cyclesPerEtu),
82
    .stopBit2(stopBit2),
83
    .oddParity(oddParity),
84
    .msbFirst(msbFirst),
85
         .ackFlags(nCsDataOut),
86
    .serialIn(isoSio),
87
    .comClk(comClk),
88
    .clk(clk),
89
    .nReset(nReset)
90
    );
91
 
92
TsAnalyzer tsAnalyzer(
93
        .nReset(nReset),
94
        .clk(clk),
95
        .isoReset(isoReset),
96
        .isoClk(isoClk),
97
        .isoVdd(isoVdd),
98
        .isoSio(isoSio),
99
        .endOfRx(endOfRx),
100
        .rxData(rxData),
101
        .isActivated(isActivated),
102
        .tsReceived(tsReceived),
103
        .tsError(tsError),
104
        .atrIsEarly(atrIsEarly),
105
        .atrIsLate(atrIsLate),
106
        .useIndirectConvention(useIndirectConvention)
107
        );
108
 
109
FiDiAnalyzer fiDiAnalyzer(
110
        .fiCode(fiCode),
111
        .diCode(diCode),
112
        .fi(fi),
113
        .di(di),
114
        .cyclesPerEtu(cyclesPerEtu),
115
        .fMax(fMax)
116
        );
117
 
118
wire run = rxStartBit | rxRun;
119
localparam WAIT_CLA = 0;
120
integer t0State;
121
always @(posedge comClk, negedge nReset) begin
122
        if(~nReset) begin
123
                fiCode<=4'b0001;
124
                diCode<=4'b0001;
125
                useT0<=1'b0;
126
                useT1<=1'b0;
127
                useT15<=1'b0;
128
                waitCardTx<=1'b0;
129
                waitTermTx<=1'b0;
130
                lastByte<=8'b0;
131
                t0State<=WAIT_CLA;
132
        end else if(isActivated) begin
133
                if(~tsReceived) begin
134
                        waitCardTx<=1'b1;
135
                end else if(~t0Received) begin
136
                end else if(~atrCompleted) begin
137
                end else if(useT0) begin
138
                        //T=0 cmd/response monitoring state machine
139
 
140
 
141
                end
142
        end
143
end
144
 
145
reg [1:0] txDir;
146
always @(*) begin: errorSigDirectionBlock
147
        if(stopBit & ~isoSio)
148
                {cardTx, termTx}=txDir[0:1];
149
        else
150
                {cardTx, termTx}=txDir[1:0];
151
end
152
always @(posedge comClk, negedge nReset) begin: comDirectionBlock
153
        if(~nReset | ~run) begin
154
                txDir<=2'b00;
155
        end else begin
156
                if(~stopBit) begin //{waitCardTx, waitTermTx} is updated during stop bits so we hold current value here
157
                        case({waitCardTx, waitTermTx})
158
                                2'b00: txDir<=2'b00;
159
                                2'b01: txDir<=2'b01;
160
                                2'b10: txDir<=2'b10;
161
                                2'b11: txDir<=2'b00;
162
                        endcase
163
                end
164
        end
165
end
166
 
167
endmodule
168
 

powered by: WebSVN 2.1.0

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