Line 32... |
Line 32... |
output reg cardTx,
|
output reg cardTx,
|
output reg termTx,
|
output reg termTx,
|
output wire guardTime,
|
output wire guardTime,
|
output wire overrunError,
|
output wire overrunError,
|
output wire frameError,
|
output wire frameError,
|
output reg [7:0] lastByte
|
output reg [7:0] lastByte,
|
|
output reg [31:0] bytesCnt
|
);
|
);
|
parameter DIVIDER_WIDTH = 1;
|
parameter DIVIDER_WIDTH = 1;
|
|
|
reg [8:0] tsCnt;//counter to start ATR 400 cycles after reset release
|
reg [8:0] tsCnt;//counter to start ATR 400 cycles after reset release
|
|
|
Line 46... |
Line 47... |
localparam P1_I = 8*2;
|
localparam P1_I = 8*2;
|
localparam P2_I = 8*1;
|
localparam P2_I = 8*1;
|
localparam P3_I = 0;
|
localparam P3_I = 0;
|
reg [CLA_I+7:0] tpduHeader;
|
reg [CLA_I+7:0] tpduHeader;
|
|
|
//wire COM_statusOut=statusOut;
|
//wire COM_clk=isoClk;
|
wire COM_clk=isoClk;
|
//integer COM_errorCnt;
|
integer COM_errorCnt;
|
//wire txPending=1'b0;
|
wire txPending=1'b0;
|
//wire txRun=1'b0;
|
wire txRun=1'b0;
|
|
|
|
wire rxRun, rxStartBit, overrunErrorFlag, frameErrorFlag, bufferFull;
|
wire rxRun, rxStartBit, overrunErrorFlag, frameErrorFlag, bufferFull;
|
assign overrunErrorFlag = overrunError;
|
assign overrunErrorFlag = overrunError;
|
assign frameErrorFlag = frameError;
|
assign frameErrorFlag = frameError;
|
|
|
wire [7:0] rxData;
|
wire [7:0] rxData;
|
reg nCsDataOut;
|
reg ackFlags;
|
|
|
wire msbFirst = useIndirectConvention;
|
wire msbFirst = useIndirectConvention;
|
wire sioHighValue = ~useIndirectConvention;
|
wire sioHighValue = ~useIndirectConvention;
|
wire oddParity = 1'b0;
|
wire oddParity = 1'b0;
|
|
|
wire [7:0] dataOut = sioHighValue ? rxData : ~rxData;
|
wire [7:0] dataOut = sioHighValue ? rxData : ~rxData;
|
|
|
|
|
`include "ComRxDriverTasks.v"
|
//`include "ComRxDriverTasks.v"
|
|
|
wire endOfRx;
|
wire endOfRx;
|
|
|
wire stopBit2 = useT0;//1 if com use 2 stop bits --> 12 ETU / byte
|
wire stopBit2 = useT0;//1 if com use 2 stop bits --> 12 ETU / byte
|
|
|
RxCoreSelfContained #(
|
RxCoreSelfContained #(
|
.DIVIDER_WIDTH(DIVIDER_WIDTH),
|
.DIVIDER_WIDTH(DIVIDER_WIDTH),
|
.CLOCK_PER_BIT_WIDTH(4'd13))
|
.CLOCK_PER_BIT_WIDTH(4'd13),
|
|
.PRECISE_STOP_BIT(1'b1))
|
rxCore (
|
rxCore (
|
.dataOut(rxData),
|
.dataOut(rxData),
|
.overrunErrorFlag(overrunError),
|
.overrunErrorFlag(overrunError),
|
.dataOutReadyFlag(bufferFull),
|
.dataOutReadyFlag(bufferFull),
|
.frameErrorFlag(frameError),
|
.frameErrorFlag(frameError),
|
.endOfRx(endOfRx),
|
.endOfRx(endOfRx),
|
.run(rxRun),
|
.run(rxRun),
|
.startBit(rxStartBit),
|
.startBit(rxStartBit),
|
.stopBit(guardTime),
|
.stopBit(guardTime),
|
.clkPerCycle(clkPerCycle),
|
.clkPerCycle(clkPerCycle),
|
.clocksPerBit(cyclesPerEtu),
|
.clocksPerBit(cyclesPerEtu-1),
|
.stopBit2(stopBit2),
|
.stopBit2(stopBit2),
|
.oddParity(oddParity),
|
.oddParity(oddParity),
|
.msbFirst(msbFirst),
|
.msbFirst(msbFirst),
|
.ackFlags(nCsDataOut),
|
.ackFlags(ackFlags),
|
.serialIn(isoSio),
|
.serialIn(isoSio),
|
.comClk(isoClk),
|
.comClk(isoClk),
|
.clk(clk),
|
.clk(clk),
|
.nReset(nReset)
|
.nReset(nReset)
|
);
|
);
|
Line 138... |
Line 139... |
wire [7:0] tdiData;//value of TDi
|
wire [7:0] tdiData;//value of TDi
|
assign {tdiCnt,tdiData}=tdiStruct;
|
assign {tdiCnt,tdiData}=tdiStruct;
|
|
|
wire [1:0] nIfBytes;
|
wire [1:0] nIfBytes;
|
HammingWeight hammingWeight(.dataIn(tdiData[7:4]), .hammingWeight(nIfBytes));
|
HammingWeight hammingWeight(.dataIn(tdiData[7:4]), .hammingWeight(nIfBytes));
|
reg [7:0] bytesCnt;
|
reg [7:0] tempBytesCnt;
|
|
always @(posedge isoClk, negedge nReset) begin
|
|
if(~nReset) begin
|
|
lastByte<=8'b0;
|
|
ackFlags<=1'b0;
|
|
bytesCnt<=32'b0;
|
|
end else if(ackFlags) begin
|
|
ackFlags<=1'b0;
|
|
end else if(frameErrorFlag|bufferFull) begin
|
|
lastByte<=dataOut;
|
|
ackFlags<=1'b1;
|
|
bytesCnt<=bytesCnt+1'b1;
|
|
end
|
|
end
|
always @(posedge isoClk, negedge nReset) begin
|
always @(posedge isoClk, negedge nReset) begin
|
if(~nReset) begin
|
if(~nReset) begin
|
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<=1'b0;
|
waitTermTx<=1'b0;
|
waitTermTx<=1'b0;
|
lastByte<=8'b0;
|
|
fsmState<=ATR_TDI;
|
fsmState<=ATR_TDI;
|
atrHasTck<=1'b0;
|
atrHasTck<=1'b0;
|
bytesCnt<=8'h0;
|
tempBytesCnt<=8'h0;
|
tdiStruct<=12'h0;
|
tdiStruct<=12'h0;
|
atrCompleted<=1'b0;
|
atrCompleted<=1'b0;
|
end else if(isActivated) begin
|
end else if(isActivated) begin
|
if(~tsReceived) begin
|
if(~tsReceived) begin
|
waitCardTx<=1'b1;
|
waitCardTx<=1'b1;
|
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
|
if(bytesCnt==nIfBytes) begin //TDi bytes
|
if(tempBytesCnt==nIfBytes) begin //TDi bytes
|
bytesCnt <= 2'h0;
|
tempBytesCnt <= 2'h0;
|
tdiStruct <= {tdiCnt+1,dataOut};
|
tdiStruct <= {tdiCnt+1,dataOut};
|
if(4'h0==tdiCnt) begin//this is T0
|
if(4'h0==tdiCnt) begin//this is T0
|
atrK <= dataOut[3:0];
|
atrK <= dataOut[3:0];
|
fsmState <= (4'b0!=dataOut[7:4]) ? ATR_TDI :
|
fsmState <= (4'b0!=dataOut[7:4]) ? ATR_TDI :
|
(4'b0!=dataOut[3:0]) ? ATR_HISTORICAL : T0_HEADER;
|
(4'b0!=dataOut[3:0]) ? ATR_HISTORICAL : T0_HEADER;
|
Line 176... |
Line 188... |
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
|
end else begin //TA, TB or TC bytes
|
end else begin //TA, TB or TC bytes
|
//TODO: get relevant info
|
//TODO: get relevant info
|
bytesCnt <= bytesCnt+1;
|
tempBytesCnt <= tempBytesCnt+1;
|
end
|
end
|
end
|
end
|
end
|
end
|
ATR_HISTORICAL: begin
|
ATR_HISTORICAL: begin
|
if(endOfRx) begin
|
if(endOfRx) begin
|
if(bytesCnt==atrK) begin
|
if(tempBytesCnt==atrK) begin
|
atrCompleted <= ~atrHasTck;
|
atrCompleted <= ~atrHasTck;
|
fsmState <= atrHasTck ? ATR_TCK : T0_HEADER;
|
fsmState <= atrHasTck ? ATR_TCK : T0_HEADER;
|
end else begin
|
end else begin
|
bytesCnt <= bytesCnt+1;
|
tempBytesCnt <= tempBytesCnt+1;
|
end
|
end
|
end
|
end
|
end
|
end
|
ATR_TCK: begin
|
ATR_TCK: begin
|
if(endOfRx) begin
|
if(endOfRx) begin
|