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] - Diff between revs 7 and 8

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 7 Rev 8
Line 128... Line 128...
localparam ATR_T0 = 0;
localparam ATR_T0 = 0;
localparam ATR_TDI = 1;
localparam ATR_TDI = 1;
localparam ATR_HISTORICAL = 2;
localparam ATR_HISTORICAL = 2;
localparam ATR_TCK = 3;
localparam ATR_TCK = 3;
localparam T0_HEADER = 0;
localparam T0_HEADER = 0;
localparam T0_PB = 0;
localparam T0_HEADER_TPDU = 1;
localparam T0_DATA = 0;
localparam T0_PB = 2;
 
localparam T0_DATA = 3;
 
localparam T0_NACK_DATA = 4;
 
localparam T0_SW1 = 5;
 
localparam T0_SW2 = 6;
 
localparam T0_HEADER_PPS = 100;
 
 
integer fsmState;
integer fsmState;
 
 
reg [11:0] tdiStruct;
reg [11:0] tdiStruct;
wire [3:0] tdiCnt;//i+1
wire [3:0] tdiCnt;//i+1
wire [7:0] tdiData;//value of TDi
wire [7:0] tdiData;//value of TDi
Line 160... Line 166...
                fiCode<=4'b0001;
                fiCode<=4'b0001;
                diCode<=4'b0001;
                diCode<=4'b0001;
                useT0<=1'b1;
                useT0<=1'b1;
                useT1<=1'b0;
                useT1<=1'b0;
                useT15<=1'b0;
                useT15<=1'b0;
                waitCardTx<=1'b0;
                {waitCardTx,waitTermTx}<=2'b00;
                waitTermTx<=1'b0;
 
                fsmState<=ATR_TDI;
                fsmState<=ATR_TDI;
                atrHasTck<=1'b0;
                atrHasTck<=1'b0;
                tempBytesCnt<=8'h0;
                tempBytesCnt<=8'h0;
                tdiStruct<=12'h0;
                tdiStruct<=12'h0;
                atrCompleted<=1'b0;
                atrCompleted<=1'b0;
 
                atrK<=4'b0;
        end else if(isActivated) begin
        end else if(isActivated) begin
                if(~tsReceived) begin
                if(~tsReceived) begin
                        waitCardTx<=1'b1;
                        {waitCardTx,waitTermTx}<=2'b10;
                end else if(~atrCompleted) begin
                end else if(~atrCompleted) begin
                        //ATR analysis
                        //ATR analysis
                        case(fsmState)
                        case(fsmState)
                                ATR_TDI: begin
                                ATR_TDI: begin
                                        if(endOfRx) begin
                                        if(endOfRx) begin
Line 186... Line 192...
                                                                                                (4'b0!=dataOut[3:0]) ? ATR_HISTORICAL : T0_HEADER;
                                                                                                (4'b0!=dataOut[3:0]) ? ATR_HISTORICAL : T0_HEADER;
                                                        end else begin//TDi, i from 1 to 15
                                                        end else begin//TDi, i from 1 to 15
                                                                fsmState <= (4'b0!=dataOut[7:4]) ? ATR_TDI :
                                                                fsmState <= (4'b0!=dataOut[7:4]) ? ATR_TDI :
                                                                                                (4'b0!=atrK) ? ATR_HISTORICAL : T0_HEADER;
                                                                                                (4'b0!=atrK) ? ATR_HISTORICAL : T0_HEADER;
                                                        end
                                                        end
 
                                                        if(12'h0=={dataOut,atrK}) begin
 
                                                                atrCompleted <= 1'b1;
 
                                                                {waitCardTx,waitTermTx}<=2'b01;
 
                                                        end
                                                end else begin //TA, TB or TC bytes
                                                end else begin //TA, TB or TC bytes
                                                        //TODO: get relevant info
                                                        //TODO: get relevant info
                                                        tempBytesCnt <= tempBytesCnt+1;
                                                        tempBytesCnt <= tempBytesCnt+1;
                                                end
                                                end
                                        end
                                        end
                                end
                                end
                                ATR_HISTORICAL: begin
                                ATR_HISTORICAL: begin
                                        if(endOfRx) begin
                                        if(endOfRx) begin
                                                if(tempBytesCnt==atrK) begin
                                                if(tempBytesCnt==atrK) begin
 
                                                        tempBytesCnt <= 8'h0;
 
                                                        if(atrHasTck) begin
 
                                                                fsmState <= ATR_TCK;
 
                                                        end else begin
                                                        atrCompleted <= ~atrHasTck;
                                                        atrCompleted <= ~atrHasTck;
                                                        fsmState <= atrHasTck ? ATR_TCK : T0_HEADER;
                                                                {waitCardTx,waitTermTx}<=2'b10;
 
                                                                fsmState <= T0_HEADER;
 
                                                        end
                                                end else begin
                                                end else begin
                                                        tempBytesCnt <= tempBytesCnt+1;
                                                        tempBytesCnt <= tempBytesCnt+1;
                                                end
                                                end
                                        end
                                        end
                                end
                                end
                                ATR_TCK: begin
                                ATR_TCK: begin
                                        if(endOfRx) begin
                                        if(endOfRx) begin
                                        //TODO:check
                                        //TODO:check
                                                atrCompleted <= 1'b1;
                                                atrCompleted <= 1'b1;
 
                                                {waitCardTx,waitTermTx}<=2'b10;
                                                fsmState <= T0_HEADER;
                                                fsmState <= T0_HEADER;
                                        end
                                        end
                                end
                                end
                        endcase
                        endcase
                end else if(useT0) begin
                end else if(useT0) begin
                        //T=0 cmd/response monitoring state machine
                        //T=0 cmd/response monitoring state machine
 
                        case(fsmState)
 
                                T0_HEADER: begin
 
                                        if(endOfRx) begin
 
                                                tpduHeader[CLA_I+:8]<=dataOut;
 
                                                tempBytesCnt <= 1;
 
                                                if(8'hFF==dataOut)
 
                                                        fsmState <= T0_HEADER_PPS;//TODO
 
                                                else
 
                                                        fsmState <= T0_HEADER_TPDU;
 
                                        end
 
                                end
 
                                T0_HEADER_TPDU: begin
 
                                        if(endOfRx) begin
 
                                                tpduHeader[(CLA_I-(tempBytesCnt*8))+:8]<=dataOut;
 
                                                if(4==tempBytesCnt) begin
 
                                                        tempBytesCnt <= 8'h0;
 
                                                        fsmState <= T0_PB;
 
                                                        {waitCardTx,waitTermTx}<=2'b10;
 
                                                end else begin
 
                                                        tempBytesCnt <= tempBytesCnt+1;
 
                                                end
 
                                        end
 
                                end
 
                                T0_PB: begin
 
                                        if(endOfRx) begin
 
                                                case(dataOut[7:4])
 
                                                        4'h6: begin
 
                                                                fsmState <= (4'h0==dataOut[3:0]) ? T0_PB : T0_SW2;
 
                                                        end
 
                                                        4'h9: begin
 
                                                                fsmState <= T0_SW2;
 
                                                        end
 
                                                        default: begin
 
                                                                case(dataOut)
 
                                                                        tpduHeader[INS_I+:8]: begin//ACK
 
                                                                                fsmState <= T0_DATA;
 
                                                                                {waitCardTx,waitTermTx}<=2'b11;
 
                                                                        end
 
                                                                        ~tpduHeader[INS_I+:8]: begin//NACK
 
                                                                                fsmState <= T0_NACK_DATA;
 
                                                                                {waitCardTx,waitTermTx}<=2'b11;
 
                                                                        end
 
                                                                        default: begin //invalid
 
                                                                                //TODO
 
                                                                        end
 
                                                                endcase
 
                                                        end
 
                                                endcase
 
                                        end
 
                                end
 
                                T0_NACK_DATA: begin
 
                                        if(endOfRx) begin
 
                                                fsmState <= T0_PB;
 
                                                {waitCardTx,waitTermTx}<=2'b10;
 
                                                tempBytesCnt <= tempBytesCnt+1;
 
                                        end
 
                                end
 
                                T0_SW1: begin
 
                                        if(endOfRx) begin
 
                                        //TODO:check != 60 but equal to 6x or 9x
 
                                                fsmState <= T0_SW2;
 
                                                {waitCardTx,waitTermTx}<=2'b10;
 
                                        end
 
                                end
 
                                T0_SW2: begin
 
                                        if(endOfRx) begin
 
                                                fsmState <= T0_HEADER;
 
                                                {waitCardTx,waitTermTx}<=2'b01;
 
                                        end
 
                                end
 
                                T0_DATA: begin
 
                                        if(endOfRx) begin
 
                                                if(tempBytesCnt==(tpduHeader[P3_I+:8]-1)) begin
 
                                                        tempBytesCnt <= 0;
 
                                                        fsmState <= T0_SW1;
 
                                                        {waitCardTx,waitTermTx}<=2'b10;
 
                                                end else begin
 
                                                        tempBytesCnt <= tempBytesCnt+1;
 
                                                end
 
                                        end
 
                                end
 
                        endcase
                end
                end
        end
        end
end
end
 
 
reg [1:0] txDir;
reg [1:0] txDir;
Line 231... Line 328...
        if(~nReset | ~run) begin
        if(~nReset | ~run) begin
                txDir<=2'b00;
                txDir<=2'b00;
        end else begin
        end else begin
                if(~guardTime) begin //{waitCardTx, waitTermTx} is updated during stop bits so we hold current value here
                if(~guardTime) begin //{waitCardTx, waitTermTx} is updated during stop bits so we hold current value here
                        case({waitCardTx, waitTermTx})
                        case({waitCardTx, waitTermTx})
                                2'b00: txDir<=2'b00;
                                2'b00: txDir<=2'b00;//no one should/is sending
                                2'b01: txDir<=2'b01;
                                2'b01: txDir<=2'b01;//terminal should/is sending
                                2'b10: txDir<=2'b10;
                                2'b10: txDir<=2'b10;//card should/is sending
                                2'b11: txDir<=2'b00;
                                2'b11: txDir<=2'b11;//either card OR terminal should/is sending (we just don't know)
                        endcase
                        endcase
                end
                end
        end
        end
end
end
 
 

powered by: WebSVN 2.1.0

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