今天来分析下 友晶科技 DE1-SOC 的CD 里面的 DE1-SoC__._._.__HWrev_.rev__SystemCDDemonstrationsFPGADE1_SoC_IR 案例的IR 接收的代码。
首先大家要先百度 了解下 NEC IR 协议。
关于DE1-SOC IR 输出的代码解析请参考 我之前的博客:https://www.cnblogs.com/DoreenLiu/p/14313287.html功能框图
首先这个案例的任务实现,手册给出了这个图:
为了实现IR 接收的功能,IR RX Controller又可以分为三个功能小块(键码侦测器(或者是IR解码器)、移位寄存器、状态机),为了让大家理解更清楚, 我直接附上《DE2-115实战宝典》的中文说明:
(DE1-SOC 手册也有相关说明, 但是 是英文版本的)
参数设定
打开 DemonstrationsFPGADE1_SoC_IRIR_RECEIVE_Terasic.v 文件,模块声明的下面是参数设定,关于IDLE_HIGH_DUR 为啥要设置成262143,这个请大家参考我之前的博客 https://www.cnblogs.com/DoreenLiu/p/14308535.html 。
接着是引导码里面高电平和低电平的时钟周期判断,parameter GUIDE_LOW_DUR = 230000; // 大家可能疑惑引导码的高电平是9ms时间,为啥这里是检测低电平,并且还只有 230000*0.02us = 4.60ms呢? 这是因为首先IR 接收器输出到FPGA的信号是反向的(被IRM_V538_TR1 的输出端的 三极管取反了)(截图来自IRM_V538_TR1.pdf 第5页)
然后当我们判断引导码9ms低电平的时候只要判断比4.5ms还多一点的4.6ms就够了。
parameter GUIDE_HIGH_DUR = 210000;// 4.5ms的高电平引导码判断情况只需判断 210000*0.02us = 4.20ms就够了,因为误差 4.5-4.2 = 0.3ms < 0.56ms就行,GUIDE_HIGH_DUR是计数器用来判断 GUIDANCE-状态------>DATAREAD状态的转变阈值。
IR侦测器
移位寄存器
DATAREAD 状态,在解析IR接收到的数据。当检测的高电平持续超过0.64us, 说明接收到的数据是1,于是将data对应位赋值1,否则,对应位保持位为0