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

Subversion Repositories iso7816_3_master

[/] [iso7816_3_master/] [trunk/] [test/] [DummyCard.v] - Diff between revs 3 and 4

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

Rev 3 Rev 4
Line 1... Line 1...
`timescale 1ns / 1ps
`timescale 1ns / 1ps
 
`default_nettype none
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// Company: 
// Company: 
// Engineer:
// Engineer:
//
//
// Create Date:   22:22:43 01/10/2011
// Create Date:   22:22:43 01/10/2011
Line 21... Line 21...
// Additional Comments:
// Additional Comments:
// 
// 
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
 
 
module DummyCard(
module DummyCard(
        input isoReset,
        input wire isoReset,
        input isoClk,
        input wire isoClk,
        input isoVdd,
        input wire isoVdd,
        inout isoSio
        inout wire isoSio
        );
        );
 
 
        // Inputs
        // Inputs
        wire [0:0] clkPerCycle=0;
        wire [0:0] clkPerCycle=0;
        reg [7:0] dataIn;
        reg [7:0] dataIn;
Line 40... Line 40...
        wire [7:0] dataOut;
        wire [7:0] dataOut;
        wire [7:0] statusOut;
        wire [7:0] statusOut;
        wire serialOut;
        wire serialOut;
 
 
 
 
 
        wire cardIsoClk;//card use its own generated clock (like true UARTs)
        // Instantiate the Unit Under Test (UUT)
        HalfDuplexUartIf uartIf (
        HalfDuplexUartIf uut (
 
                .nReset(isoReset),
                .nReset(isoReset),
                .clk(isoClk),
                .clk(isoClk),
                .clkPerCycle(clkPerCycle),
                .clkPerCycle(clkPerCycle),
                .dataIn(dataIn),
                .dataIn(dataIn),
                .nWeDataIn(nWeDataIn),
                .nWeDataIn(nWeDataIn),
Line 54... Line 53...
                .nCsDataOut(nCsDataOut),
                .nCsDataOut(nCsDataOut),
                .statusOut(statusOut),
                .statusOut(statusOut),
                .nCsStatusOut(nCsStatusOut),
                .nCsStatusOut(nCsStatusOut),
                .serialIn(isoSio),
                .serialIn(isoSio),
                .serialOut(serialOut),
                .serialOut(serialOut),
                .comClk(comClk)
                .comClk(cardIsoClk)
        );
        );
 
 
 
reg sendAtr;
 
reg [8:0] tsCnt;//counter to start ATR 400 cycles after reset release
 
 
 
reg [7:0] buffer[256+5:0];
 
localparam CLA_I= 8*4;
 
localparam INS_I= 8*3;
 
localparam P1_I = 8*2;
 
localparam P2_I = 8*1;
 
localparam P3_I = 0;
 
reg [CLA_I+7:0] tpduHeader;
 
 
 
wire COM_statusOut=statusOut;
 
wire COM_clk=isoClk;
 
integer COM_errorCnt;
 
 
wire txRun,txPending, rxRun, rxStartBit, isTx, overrunErrorFlag, frameErrorFlag, bufferFull;
wire txRun,txPending, rxRun, rxStartBit, isTx, overrunErrorFlag, frameErrorFlag, bufferFull;
assign {txRun, txPending, rxRun, rxStartBit, isTx, overrunErrorFlag, frameErrorFlag, bufferFull} = statusOut;
assign {txRun, txPending, rxRun, rxStartBit, isTx, overrunErrorFlag, frameErrorFlag, bufferFull} = statusOut;
 
 
 
`include "ComDriverTasks.v"
 
 
assign isoSio = isTx ? serialOut : 1'bz;
assign isoSio = isTx ? serialOut : 1'bz;
 
 
reg sendAtr;
 
reg [8:0] tsCnt;//counter to start ATR 400 cycles after reset release
/*T=0 card model
 
 
 
ATR:
 
        3B 00
 
 
 
Implemented commands:
 
        write buffer:
 
                tpdu: 00 0C 00 00 LC data
 
                sw:   90 00
 
        read buffer:
 
                tpdu: 00 0A 00 00 LE
 
                response: data
 
                sw:   90 00
 
        any other:
 
                sw:   69 86
 
*/
 
task sendAckByte;
 
        sendByte(tpduHeader[INS_I+7:INS_I]);
 
endtask
 
 
 
task writeBufferCmd;
 
integer i;
 
begin
 
        sendAckByte;
 
        for(i=0;i<tpduHeader[P3_I+7:P3_I];i=i+1) begin
 
                receiveByte(buffer[i]);
 
        end
 
        sendWord(16'h9000);
 
end
 
endtask
 
 
 
task readBufferCmd;
 
integer i;
 
integer le;
 
begin
 
        sendAckByte;
 
        le=tpduHeader[P3_I+7:P3_I];
 
        if(0==le) le=256;
 
        for(i=0;i<le;i=i+1) begin
 
                sendByte(buffer[i]);
 
        end
 
        sendWord(16'h9000);
 
end
 
endtask
 
 
 
integer i;
always @(posedge isoClk, negedge isoReset) begin
always @(posedge isoClk, negedge isoReset) begin
        if(~isoReset) begin
        if(~isoReset) begin
                nWeDataIn<=1'b1;
                nWeDataIn<=1'b1;
                nCsDataOut<=1'b1;
                nCsDataOut<=1'b1;
                nCsStatusOut<=1'b1;
                nCsStatusOut<=1'b1;
 
 
                tsCnt<=9'b0;
                tsCnt<=9'b0;
                sendAtr<=1'b1;
                sendAtr<=1'b1;
        end else if(tsCnt!=9'd400) begin
        end else if(tsCnt!=9'd400) begin
                tsCnt <= tsCnt + 1'b1;
                tsCnt <= tsCnt + 1'b1;
        end else if(sendAtr) begin
        end else if(sendAtr) begin
                sendAtr<=1'b0;
                sendAtr<=1'b0;
                dataIn<=8'h3B;
                sendByte(8'h3B);
                nWeDataIn<=1'b0;
                sendByte(8'h00);
                @(posedge isoClk)
                waitEndOfTx;
                nWeDataIn<=1'b1;
 
                @(posedge isoClk)//should not be needed
 
                wait(txPending==0);
 
                dataIn<=8'h00;
 
                nWeDataIn<=1'b0;
 
                @(posedge isoClk)
 
                nWeDataIn<=1'b1;
 
        end else begin
        end else begin
 
                //get tpdu
 
                for(i=0;i<5;i=i+1)
 
                        receiveByte(tpduHeader[(CLA_I-(i*8))+:8]);
 
                //dispatch
 
                case(tpduHeader[7+CLA_I:P2_I])
 
                                32'h000C0000: writeBufferCmd;
 
                                32'h000A0000: readBufferCmd;
 
                                default: sendWord(16'h6986);
 
                endcase
        end
        end
end
end
 
 
endmodule
endmodule
 
 

powered by: WebSVN 2.1.0

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