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

Subversion Repositories iso7816_3_master

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /iso7816_3_master/trunk
    from Rev 7 to Rev 8
    Reverse comparison

Rev 7 → Rev 8

/test/tbIso7816_3_Master.v
186,8 → 186,8
end
@(posedge clk);
end
$display("Two cycle pause in communication detected, stop simulation");
#200
$display("Two cycle pause in communication detected, stop simulation, time=",$time);
#(CLK_PERIOD*372*12);
$finish;
end
//T=0 tpdu stimuli
/test/HammingWeight.v
14,6 → 14,7
 
always @(*) begin:hamminWeightBlock
integer i;
hammingWeight=0;
for(i=0;i<DATA_WIDTH;i=i+1) begin
hammingWeight=hammingWeight + dataIn[i];
end
/test/iso7816_3_t0_analyzer.v
130,8 → 130,14
localparam ATR_HISTORICAL = 2;
localparam ATR_TCK = 3;
localparam T0_HEADER = 0;
localparam T0_PB = 0;
localparam T0_DATA = 0;
localparam T0_HEADER_TPDU = 1;
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;
 
reg [11:0] tdiStruct;
162,16 → 168,16
useT0<=1'b1;
useT1<=1'b0;
useT15<=1'b0;
waitCardTx<=1'b0;
waitTermTx<=1'b0;
{waitCardTx,waitTermTx}<=2'b00;
fsmState<=ATR_TDI;
atrHasTck<=1'b0;
tempBytesCnt<=8'h0;
tdiStruct<=12'h0;
atrCompleted<=1'b0;
atrK<=4'b0;
end else if(isActivated) begin
if(~tsReceived) begin
waitCardTx<=1'b1;
{waitCardTx,waitTermTx}<=2'b10;
end else if(~atrCompleted) begin
//ATR analysis
case(fsmState)
188,6 → 194,10
fsmState <= (4'b0!=dataOut[7:4]) ? ATR_TDI :
(4'b0!=atrK) ? ATR_HISTORICAL : T0_HEADER;
end
if(12'h0=={dataOut,atrK}) begin
atrCompleted <= 1'b1;
{waitCardTx,waitTermTx}<=2'b01;
end
end else begin //TA, TB or TC bytes
//TODO: get relevant info
tempBytesCnt <= tempBytesCnt+1;
197,8 → 207,14
ATR_HISTORICAL: begin
if(endOfRx) begin
if(tempBytesCnt==atrK) begin
atrCompleted <= ~atrHasTck;
fsmState <= atrHasTck ? ATR_TCK : T0_HEADER;
tempBytesCnt <= 8'h0;
if(atrHasTck) begin
fsmState <= ATR_TCK;
end else begin
atrCompleted <= ~atrHasTck;
{waitCardTx,waitTermTx}<=2'b10;
fsmState <= T0_HEADER;
end
end else begin
tempBytesCnt <= tempBytesCnt+1;
end
208,6 → 224,7
if(endOfRx) begin
//TODO:check
atrCompleted <= 1'b1;
{waitCardTx,waitTermTx}<=2'b10;
fsmState <= T0_HEADER;
end
end
214,8 → 231,88
endcase
end else if(useT0) begin
//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
233,10 → 330,10
end else begin
if(~guardTime) begin //{waitCardTx, waitTermTx} is updated during stop bits so we hold current value here
case({waitCardTx, waitTermTx})
2'b00: txDir<=2'b00;
2'b01: txDir<=2'b01;
2'b10: txDir<=2'b10;
2'b11: txDir<=2'b00;
2'b00: txDir<=2'b00;//no one should/is sending
2'b01: txDir<=2'b01;//terminal should/is sending
2'b10: txDir<=2'b10;//card should/is sending
2'b11: txDir<=2'b11;//either card OR terminal should/is sending (we just don't know)
endcase
end
end

powered by: WebSVN 2.1.0

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