本帖最后由 芯航线跑堂 于 2017-1-6 20:13 编辑
HT6221红外遥控解码
实验目标:学会使用FPGA来对脉冲编码的数字序列进行解码 实验平台:芯航线FPGA学习套件主板,基于HT6221的红外遥控器 实验现象: 按下红外遥控上的按键,然后在Quartus II软件中使用Insystem sources and probes editor中观察解码结果,根据解码结果与红外遥控实际发出的数值进行比较从而判断解码的正确性。 实验原理: 1.红外遥控协议分析(NEC协议) HT6221为Holtek公司生产的多功能编码芯片,其采用PPM(Pulse PositionModulation)进行编码。 HT6221芯片是一款基于NEC红外通信协议的遥控编码芯片。基于HT6221芯片的红外遥控发送一次数据的数据帧定义如图19-1所示:一帧数据由帧头、地址码和数据码以及数据反码组成。 图19-1数据帧定义 其中,引导码由9ms高电平的头码和4.5ms低电平的间隙组成,代表一个数据帧的帧头;地址码共16位,低位在前,高位在后。因此,该协议理论上支持最高65536个不同的用户;8位数据码及其反码也是低位在前,高位在后。因此,理论上该协议支持高达256个用户指令。该协议采用脉冲之间不同时长的时间间隔来区分“1”和“0”,图19-2为其编码协议中“1”和“0”的编码波形。 图19-2数据编码波形 而在实际中,此为红外遥控发射头发出的波形,而在实际接收时,接收头接收到信号后输出的波形刚好与此波形反相。因此,本模块的设计实际就是对图19-3波形的提取。数据0是0.56ms的低电平和0.56ms的高电平,数据1是0.56ms的低电平和1.12ms的高电平。可见0和1的区别在于高电平持续时间的长短不同,根据这个区别我们就可以见别出0和1了。 图19-3-1帧头接收波形 图19-3-21/0数据接收波形 2.红外遥控的长按 以上只说明了短按,长按时输出波形如图19-4所示,此处不再详述。为了简化设计方便理解,本模块设计先不对这种情况解析。 图19-4长按时输出波形 3.解码模块关键功能分析 通过以上对一帧数据的发送波形解读,可知,解码的关键就是对9ms+ 4.5ms的引导码,以及“0”和“1”的识别。前面已经提到过,实际接收头接收到信号后输出的波形为发送波形的反码,因此,解码模块的关键设计就是要识别9ms的低电平、4.5ms的高电平、560us的低电平、1690us的高电平和560us的高电平。只要这四个电平识别无误,便能解码出正确的红外数据。 因此,一帧数据的解码流程如图19-5所示。 图19-5一帧数据解码流程 4.芯航线配套红外遥控键码图 采用HT6221方案的红外遥控键码图如图19-6所示。
图19-6红外遥控键码图 实验步骤: 从上面的分析这里需要四个计数器分别对9ms、4.5ms、0.56ms以及1.69ms进行计数判断。同时由于不同遥控器厂家晶振精度不一致,因此不一定严格按照以上时序图的时序参数来产生波形,因此这里给每个计数器的值一定的的范围来实现兼容不同的红外遥控器。这里的范围可以针对特定的红外遥控器再行修改,一般采取以下范围即可。
同样由于这里红外接收头输入到FPGA内部的信号也是异步信号,也需要进行数据同步,同步后的数据再用两级寄存器来判断上升沿还是下降沿。具体设计及数据同步、边沿检测原理可参考按键设计一讲。
4.红外解码状态机分析 现在对状态进行编码首先由以上的分析可以看出状态分为: S0:空闲状态(IDEL),等待IR接收信号下降沿的到来。 S1:识别9ms的低电平引导码,识别成功则继续识别4.5ms的高电平引导码,否则返回空闲态。 S2:识别4.5ms的高电平引导码,识别成功则进入读码状态,否则返回空闲态。 S3:读码状态,若32个码字已经读完或者读取过程中发生了错误,则返回空闲态 。 但是在解码之前需要判断引导码,如果引导码不正确就不解码,所谓判断引导码,就是看看是否有9ms的低电平和4.5ms的高电平。 由上面分析可知计数器最大计数时间为9ms, 如果高脉冲或者低脉冲超过9ms则出现错误,计数器可直接清零,在状态机时候也判断下是否计数值在这个范围内。
现在开始编写状态机,使能状态机时需先判断计数器的状态。
初始态就是检测到下降沿就就如9ms低电平判断,否则就保持初始态
在9ms判断状态中,一旦有上升沿就开始判断是否是9ms计时完成,如果不是则认为从上一个下降沿到这一个上升沿并不是9ms的载波,回到初始态。反之如果载波检测完成,则进入4.5ms检测状态,同时计数器清零。 图19-3-1帧头接收波形
4.5ms与9ms检测类似,这里可以自行分析。
读码状态时,从图可以看出不论传输0还是1 均为560ms开始 这里因此先开始判定560ms的低电平 如果有下降沿则是 图19-3-21/0数据接收波形
开始状态接收时可以从图19-1看出有32个数据即32个下降沿。
这里直接将一次数据接收完成标志信号赋给Get_Flag接口。
将此文件设置为顶层,新建ir_decode_tb.v文件。这里除了实现例化需要仿真的文件以及时钟创建,还需模拟两次发送数据。主要内容如下,再次进行分析和综合直至没有错误以及警告,保存到testbench文件夹下。 首先实现发送32位数据中1bit数据时的波形。先输出560us的低电平然后如果当前数据为0则继续输出560us高电平,否则输出1690us的高电平。此处参照图19-3-2不难理解。
由图19-1可以看出,一帧数据由9ms低电平、4.5ms高电平、16位地址位、8位数据位、8位数据反码以及1位结束位构成。采用三个for循环来实现地址码以及数据码的发送。
这样实现复位后先发送一次地址码为’h1、数据码为8’h12,再发送一次地址码为’3、数据码为8’heb,两次数据发送的过程。
编译无误后设置好仿真脚本后进行功能仿真,可以看到如图19-7所示的部分波形文件。可以看出iIR正常产生了数据发送信号,且一帧数据传输结束后Get_Flag均会产生一个时钟周期的高电平。Get_Flag有效后可以看到数据码接收到是1110_1101_0001_0010(MSB),高八位与低八位互为反码,将低八位转换为十六进制数后为’h12,与激励文件中产生的数据一致。地址码以及后一帧数据接收可以自行分析。 图19-7 功能仿真波形 为了实现板级验证,这里使用ISSP进行测试。其中ISSP主要配置如图19-8所示。 图19-8 ISSP主要设置 分配引脚后全编译无误后下载工程到开发板中,并启动ISSP。按下遥控上的CH- 也就是数据码’h45,此时ISSP抓取到数据为‘hBA45FF00,可算出’h45其反码为’hBA,符合设计要求。这样可以再按下其他按键进行测试分析。 图19-9 ISSP抓取数据 这样就是实现了一个红外数据解码的模块设计。
小梅哥 芯航线电子工作室
|