技术文档typeB.docx

上传人:b****5 文档编号:4101599 上传时间:2022-11-27 格式:DOCX 页数:37 大小:243.01KB
下载 相关 举报
技术文档typeB.docx_第1页
第1页 / 共37页
技术文档typeB.docx_第2页
第2页 / 共37页
技术文档typeB.docx_第3页
第3页 / 共37页
技术文档typeB.docx_第4页
第4页 / 共37页
技术文档typeB.docx_第5页
第5页 / 共37页
点击查看更多>>
下载资源
资源描述

技术文档typeB.docx

《技术文档typeB.docx》由会员分享,可在线阅读,更多相关《技术文档typeB.docx(37页珍藏版)》请在冰豆网上搜索。

技术文档typeB.docx

技术文档typeB

技术文档

一.整体模块功能简介及架构设计;

二.输入输出端口说明及接口说明;

三.底层功能模块功能及算法及接口说明;

四.结论

一RFID数字控制器的功能简介及整体架构设计

该RFID数字控制器的设计是基于ISO/IEC18000-6TYPEB设计的,符合该协议的相关规定。

RFID数字控制器的功能是对芯片的模拟前端电路解调后的数据(也即读卡器发送的命令)进行后端处理,并且决定是否向读卡器发送应答。

本设计可以对读卡器发送的三条指令进行处理,分别是GROUP_SELECT_NE,READ,WIRTE。

其中GROUP_SEL_NE是读卡器用于选择其磁场范围内的卡以进行操作的命令;而READ和WRITE则是读卡器在识别出了一个单独的卡之后对其进行读写操作所用的命令。

处理GROUP_SELECT_NE命令的时候,整个数字控制器的处理流程如下:

当卡刚刚进入读卡器的磁场范围之后,首先要经历一个上电复位的过程,在这个过程中,模拟的前端电路给出低电平有效的脉冲复位信号reset,(注:

此时模拟前端已经完成了整体的复位,并且时钟也已经给出)。

同时也把高频的采样时钟发送给数字电路。

卡在复位之后,主状态先跳转到READY,等待读卡器发送有效数据。

一旦识别出命令数据,开始对其进行处理。

如果接收到一条完整的命令,首先应识别出同步头---即9个曼彻斯特编码的01,在接收这9个01的过程中,卡应该计算出一个用于同步的参考计数值,用于接下来继续接收后面数据的同步采样点。

同步之后就要接着识别定界符序列(11_00_11_10_10),判断数据从哪里开始发送。

接着就开始接收正式的命令代码及其参数。

解码和CRC校验这两个过程同时进行,当数据都接收完之后,校验也同时完成,此时就根据校验结果是否正确来决定是否进行下一步的动作。

如果标签此时的主状态为READY,并且校验也正确的话,把命令参数部分的8byte数据与rom存储器中指定地址处的8byte数据相比较,如果比较结果得出二者不相等的话,主状态转移到ID状态,同时标签向读卡器发送64位的UID号。

(每一个卡都有各自单独的不相同的UID号)。

如果接收完数据之后的校验结果是不正确的话,标签不应发送任何应答,并且主状态也不应发生变化,而是要等待下一条命令的到来。

校验结果是否正确其实说明的是标签接收到的命令数据是否正确,如果正确就可以按照它去执行;而主状态是否发生转移则取决于比较对应的数据或者是UID号而得到的结果;最终标签是否向读卡器发送应答数据则取决于标签当前所处的状态及上一步比较的结果如何。

在处理READ命令的时候,流程如下:

前面同步,解码,及校验的过程都与GROUP_SELECT_NE相类似,只是根据当前卡所处的mainstate的不同,卡所要执行的操作是不同的。

如果卡处在ready或者id状态的话,就需要把命令中包含的UID数据与卡的存储器中包含的命令数据进行比较之后再确定是否可以进行读取连续八字节数据的操作;但是如果卡就处在了data_exchange状态的话,就不用对UID进行比较是否一致就可以直接进行读取数据的操作。

WRITE命令与READ命令的主状态的转移条件类似,即如果卡的mainstate是在ready或者id的时候,需要把命令参数部分的UID与卡中存储的UID进行一致性校验,如果两者一样了才可以进行写操作,否则不应有任何响应及应答;但是如果卡的mainstate是在data_exchange状态的话,不用对UID进行比较就可以直接进行写操作,并且在写成功之后返回一个acknowledge的标志信息。

标签的状态转移的标准是根据通信协议中的规定,如下图所示:

图表1:

状态转移图

 

根据对协议的理解,对数字控制器整体构架的设计如下:

图表2:

系统架构图

二顶层模块的输入及输出端口定义

端口名称

端口方向

位宽

功能

clk

input

1

模拟前端给出的高频采样时钟

data_in

input

1

从读卡器解调后的数据,在读卡器不发送有效的命令数据的时候,data_in持续为高。

reset

input

1

上电复位脉冲(低有效)

data_out

output

1

卡反送给读卡器的应答。

在卡不向读卡器发送应答数据的时候,data_out保持为低。

io2

output

1

表示数据传输方向的信号;卡向读卡器发送数据的时候,io2=1;反之,io2置0。

三底层功能模块说明

(一)时钟同步模块,sample_clk_generation

1模块的端口说明

端口名称

端口方向

位宽

功能

clk

input

1

模拟前端给出的高频采样时钟

data_in

input

1

解调后的读卡器发送来的数据

reset

input

1

异步上电复位脉冲(低有效)

code_error

input

1

同步失误会导致解码错位,即可能出现00或者11序列,一旦接收到这样的序列,就从解码模块发出code_error,告诉时钟同步暂停工作,回到等待状态等待下一条命令。

addr

input

8

复用地址寄存器,用于计算同步的参考计数值

stop_receive

input

1

接收控制会自动控制已经接收的数据的位数,当判断接收数据位数足够时发出结束信号,告诉时钟同步开始进入数据处理阶段(时钟是二分频)。

crc_riorwr

input

2

校验结果是否正确。

crc_riorwr=2’b01,校验正确;crc_riorwr=2’b10,校验结果错误;crc_riorwr=2’b00,校验结果正确与否未知。

no_response

input

1

决定标签是否发送应答数据。

begin_encode

input

1

何时开始发送应答数据(包括同步头,定界符,数据和校验码)。

send_over

input

1

发送过程何时结束。

count1

input

6

时钟计数器

count0

input

5

时钟计数器

assert_16

input

1

当公用位数计数器值为16时,这个信号有效。

state

output

4

时钟同步模块的状态寄存器

nextstate

output

4

控制状态的组合逻辑

count_store

output

6

时钟同步的基准参考值

syn_global_reset

output

1

在时钟同步模块处于等待命令并且卡也没有发送数据的时候,发出全局同步复位信号,使其它的功能模块处于复位状态,防止状态的空转。

sample_clk

output

1

采样用的低频同步时钟

begin_decode

output

1

解码模块及接收控制模块的启动信号

add_count_clk_generation

output

1

在计算同步参考计数值期间,对0和1的个数进行计数从而判断何时停止。

reset_count0

output

1

将count0复位,即置0。

reset_count1

output

1

将count1复位,即置0。

start_count0

output

1

使count0执行加1操作。

start_count1

output

1

使count1执行加1操作。

addr_mux2_sel

output

2

作为复用地址寄存器addr[8:

1]的控制选通信号,选择进入该寄存器的数据端口。

io2

output

1

作为数据传输方向的标志信号,当卡向读卡器发送数据的时候,把io2置1,否则置0。

syn_data_in

output

1

用低频采样时钟采样到的数据。

2时钟同步模块的功能:

时钟同步模块是为后续的各个功能模块提供运转时钟sample_clk,同时在接收数据的时候,这个时钟也作为对读卡器编码后的基带数据进行采样的采样时钟。

这个模块与后面负责接收控制、数据解码和CRC校验的模块有相互信息的交换,在接收的过程中如果发现了违反标准的电平序列,表明采样时钟已经相对数据发生了偏移,这时即使再继续采样最终得到的数据也是错误的,故应当停止采样并且等待下一条命令的到来,这时只要sample_clk的值保持不变,后面相关的功能模块都处于停止状态,因为没有时钟的话,同步模块是不能工作的。

或者在数据都已经接收完毕校验完毕之后,如果发现有CRC校验错误的话,应当将这次接收的数据丢弃,回到原始状态等待下一条命令的到来。

通过这种方式,可以使得后续的功能模块省去不必要的动作,从而节省了功耗和数据的处理时间。

Sample_clk提供的时钟速率有两种可能,在卡接收从读卡器发送过来的数据并进行解码和卡向读卡器发送数据的时候,所采用的时钟速率是根据同步数据祯得到的同步速率;而在中间一段卡对接收到的数据进行处理的时候,sample_clk提供的是对原始时钟的二分频,这样的话一方面提高了在卡的内部的数据处理速度,另一方面也使得采样时钟分频计数器停止工作。

3时钟同步模块的基本状态转移如下图所示:

图表3:

时钟同步模块的状态转移图

在WAIT状态的时候,是使用count1计数器对高电平的长度进行计数,也就是识别每条命令之前的quiet阶段(在这个阶段,数据应该维持至少400us的高电平)。

需要注意的是count1应该对连续的1进行计数,一旦计数值还没达到111_1110的时候,出现了低电平,表明当前的数据不是quiet阶段的连续高电平1,所以在计数值达到111_1110之前就出现0的话就对count1复位,使count1再从0开始对连续的高电平计数。

当这样连续的高电平持续一定长度之后,即assert_count1_full=1时,状态跳转到Wait_head,开始等待同步头的到来,同步头开始的标志是由持续高电平之后的0(1到0的下跳沿)开始的,所以一检测到0,状态跳至S0状态,并启动count0对这一段低电平计数。

在S0状态的时候,当data_in由0变1之后,状态转入TRANSITION状态。

在这个状态下,在高电平1的阶段时,把对前一个低电平的计数值count0放入寄存器addr中,同时进行累加运算;同样地,在低电平0的阶段时,则把对前一个高电平的计数值count1放入寄存器addr中,同时也进行累加运算。

直到累加的0和1的数目之和达到16个为止,停止累加。

并把最终得到的累加和除以8之后装入count_store寄存器中,并把这个值作为此后同步采样和发送应答时的参考计数值,同时转入S1状态等待识别定界符。

Count_store[5:

1]就是同步头中一个01序列的长度。

(定界符是11-00-11-10-10)。

在S1状态的时候,首先判断是否有三个连续的1(即111)的出现,第一个1是指之前的9个01的最后一个1,而第二和第三个1则是定界符的前两位。

由于count_store的长度相当于manchester编码后的2bit数据的长度,所以只要对1的计数值大于了(5/4)count_store,就可以认为是3个1的出现。

把(5/4)count_store==delimiter_count,当count1>delimiter_count并且data_in=0的时候,状态跳到S2开始对定界符中接下来的00序列进行判断。

在S2状态的时候,数据已经是低电平,即count0在状态跳转时已经开始对低电平计数了,并且已经使count1复位。

此时00的长度应该与count_store相等,但是在这里只要count0>(3/4)count_store就可以认为是00序列。

把(3/4)count_store==delimiter_count0,当count0>delimiter_count0并且data_in从0跳变为1的时候,状态跳转至S3,接着判断定界符中接下来的序列111。

与在S1状态的时候相类似,当count1>delimiter_count的时候,同时data_in从1跳变到0的时候,认为已经检测到了三个连续的1,和接下来的0,跳转到S4接着进行判断。

由于定界符中接下来的部分都是单个bit的数据,所以不用考虑数据的长度问题,只需考虑数据的电平问题即可。

处在S4状态时,当data_in==1,状态跳转到S5;在S5的时候,当data_in==0的时候状态再跳转到S6。

S6的时候,已经检测出了前面的几位定界符,这时就剩下定界符的最后一位了。

在这一位的时候需要特别注意,因为接下来将要发送的就是command_data了,第一位的命令代码有可能是0也有可能是1。

所以在S6的时候需要根据count0的计数值,通过判断是单个bit的0还是连续的两个0进行状态的跳转。

sample_point_count==(3/4)count_store,即如果在count0sample_clk_count,表明第一位的命令代码数据应该也是0。

如果是前一种情况,状态跳至1ST_BIT_CODE;否则如果是第二种情况的话,状态跳至S7。

S7和S8是在解码并采样数据时相互跳转的两个状态。

其中S7时,表明当前data_in是高电平,采用count1对高电平的长度进行计数,并且在data_in刚刚从0跳变成为1的时候,给出一个采样脉冲sample_clk,如果发现count1的计数值等于了sample_clk_count的时候再次给出采样脉冲,因为当count1==(3/4)count_store的时候可以认为出现了两个连续的1。

而对于S8也是同样的道理,当状态在S8的时候,表明当前的data_in是低电平,采用count0对低电平的长度进行计数,同样也是在data_in刚刚从1变成0的时候给出一个采样脉冲,如果发现count1=sample_clk_count就再次给冲采样脉冲,这样在认为是出现了两个连续的0的时候就可以保证采到两个0。

接收数据的位数由接收控制模块来进行控制,当数据接收过程应当结束时,会发出stop_receive信号,此时时钟同步模块的状态会从S7或者S8跳转到PROCESSING状态,准备对接收到的数据进行处理,在这个状态给出的sample_clk是对系统高频时钟的二分频。

在这段时间内就是进行数据处理,比如对指定的两组数据做比较或者从rom存储器中读出8byte数据或者是进行写操作。

当处理完毕,并且可以发送应答的时候,begin_encode信号会出现一小段时间的高电平,此时状态便从PROCESSING跳转到ENCODING_1。

在接下来的发送及编码过程中,状态就在ENCODING_1和ENCODING_2之间跳转,并以count_store为参考值对时钟进行分频作为发送的基准时钟。

当数据全部发送完之后,发送控制模块会给出send_over信号,此时时钟同步模块无论是在ENCODING_1还是ENCODING_2状态,都再次回到WAIT状态,等待下一条命令的到来。

至此,就完成了一个从接收到发送的全过程。

sample_clk作为其它后续模块的时钟,所以在WAIT状态的时候sample_clk维持低电平,使得时钟同步在等待下一条命令的quiet的过程中,后面的模块都先暂停工作。

直到进入了Wait_head状态的时候,给出sample_clk和一个全局的同步复位信号syn_global_reset对后面的模块同时都进行同步复位。

(二)接收控制模块receive_control

1模块的端口说明

端口名称

端口方向

位宽

功能

sample_clk

input

1

时钟

reset

input

1

异步复位信号

syn_global_reset

input

1

全局同步复位信号

begin_decode

input

1

解码开始

code

input

4

命令代码的低四位

assert_8

input

1

当count_receive=8时,assert_8=1;

assert_16

input

1

当count_receive==16时,assert_16=1;

assert_64

input

1

当count_receive==64时,assert_64=1;

crc_right

input

1

当数据全部接收完之后,crcreg中的数值为1111-0000-1011-1000的话,表明接收到的数据是正确无误的,并且crc_right=1。

read_in

input

1

表明解码模块当前正在对1st-bit的manchester数据进行判断。

shift_code_receive

output

1

寄存器组code[8:

1]接收时的使能移位信号。

shift_addr_receive

output

1

寄存器组address[8:

1]接收时的使能移位信号。

shift_mask_receive

output

1

寄存器组byte_mask[8:

1]接收时的使能移位信号。

shift_data_receive

output

1

寄存器组uid_reg[64:

1]接收时的使能移位信号。

shift_crc_receive

output

1

寄存器组crcreg在接收数据时的使能移位信号。

receive_crc_check

output

1

表明正在接收数据,包括数据和校验码

ena_crc

output

1

表明正在接收的是crc校验码

set_count_receive

output

1

将count_receive复位

stop_receive

output

1

停止继续接收数据

crc_riorwr

output

2

最终表明crc校验是否正确,当crc_riorwr=2’b01,表明校验结果是正确的;当crc_riorwr=2’b10,表明校验结果是错误的;当crc_riorwr=2’b00,表明不确定校验结果正确与否。

state

output

4

接收控制模块的状态寄存器

nextstate

output

4

下一个状态

2接收控制模块的基本功能

接收控制模块的主要任务是从开始接收的那一点开始根据高八位的命令代码决定何时停止接收过程,因为对于不同的命令而言,命令代码之后所带的参数部分的长度是不一样的,接收控制就是通过对接收的数据长度进行计数来决定何时停止接收解码的数据转入数据处理阶段。

3接收控制模块的状态转移图如下所表示的

图表4:

接收控制模块的状态转移图

在复位状态下,state停留在S10,没有有效的控制电平输出,并且crc校验结果是不确定(00)的状态。

一旦begin_decode变为有效,即开始对命令数据解码,状态跳转到S0。

S0是作为一个中间的缓冲状态,是为了协调解码与接收控制的步调而加入的一个状态,所以在下一个时钟沿到来的时候,状态就跳到S1。

在S1状态下,表明此时正在接收的是8位的命令代码,当计数数据位数等于8位的时候,表明command_code已经都放入了code_reg中,状态跳转到S2。

在S2状态下,需要根据之前接收到的command_code来判断接下来将会接收到的是哪一部分的参数。

比如对于group_select_ne,紧跟在command_code之后的是address,所以如果code==group_select_ne的话,下一个状态应该到S3;如果是read或者write的话,下一个状态应该是S5。

对于不同的命令,在S2设置查找表,根据命令代码的不同将会跳转到不同的状态去。

在S3状态下,表明当前接收的是address,数据应当移位进入address寄存器。

在S4状态下,表明当前接收的是byte_mask或者是写命令中的8bits数据,此时数据应当移位进入byte_mask寄存器。

在S5状态下,表明当前接收的是64bits的数据,此时解码后的数据应当移位进入uid_regs寄存器。

接下来的S6和S7状态都是在接收16位的crc校验码。

在S7的时候,对count_receive进行复位。

之后所有的数据就都已经移入了crcreg寄存器,此时可以根据crcreg中剩下的数据来判断校验是否正确,如果正确的话,跳至S8,并且crc_riorwr=2’b01;反之如果错误的话,跳至S9,并且crc_riorwr=2’b10。

这个校验的结果将被状态所保持,直到下一个全局同步复位到来的时候,状态有回到S10,则校验结果就又处于未知状态。

接收控制的主要作用就是根据command_code的不同,通过控制使能信号让解码后的数据进入不同参数所对应的不同的寄存器当中。

同时在接收完毕后发出结束信号,并保存最终的crc校验的结果。

(三)解码模块decode

1模块的端口说明

端口名称

端口方向

位宽

功能

sample_clk

input

1

时钟

reset

input

1

系统异步上电复位信号

syn_global_reset

input

1

全局同步复位信号

begin_decode

input

1

开始解码的启动信号

syn_data_in

input

1

用sample_clk同步采样到的数据

stop_receive

input

1

接收过程停止,即解码也停止

state

output

3

解码模块的状态寄存器

nextstate

output

3

下一个状态

q_out_decode

output

1

解码后的数据

add_count_decode

output

1

使count_receive进行加1操作,即对解码后数据的位数进行计数

read_in

output

1

读入1st_bit的manchester数据,此时寄存器可以移位

code_error

output

1

检测到错误序列11或者00

2解码模块的状态转移如下图所表示:

图表5:

解码模块的状态转移图

WAIT是在复位之后进入的等待状态(idle),此时decode模块没有有效输出,等待启动信号的到来。

当begin_decode变为高电平的时候,状态转入S1,开始了对manchester码的解码过程。

在S1的时候判断1STbit数据位的电平,如果是1,就转到S2;如果是0,就转到S3。

S2和S3是判断2NDbit数据位的电平。

在S2如果采样电平为1的话,则表明检测到11序列,这说明同步失败,因为这种序列在曼彻斯特编码中认为是错误的,所以这时转到CODING_ERROR状态,发出code_error,告诉时钟同步模块开始重新等待接收下一条命令。

但是在S2的时候,如果接收到的采样电平为0的话,表明检测到了10序列,输出解码数据是1,之后再回到S1状态从头再开始判断电平的跳变方式。

在S3状态的时候,如果采样到的电平是0的话,则表明检测到00序列,这说明同步失败,因为这种序列在曼彻斯特编码中认为是错误的。

所以这时转到CODING_ERROR状态,发出code_error信号,告诉时钟同步模块开始重新等待接收下一条命令。

但是在S3的时候,如果接收到的采样电平为1的话,表明检测到了01序列,输出解码数据是0,之后再回到S1状态从头开始判断。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 城乡园林规划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1