今天来分析下 友晶科技 DE1-SOC 的CD 里面的  DE1-SoC__._._.__HWrev_.rev__SystemCD\Demonstrations\FPGA\DE1_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 手册也有相关说明, 但是 是英文版本的)

 

 

 

 

参数设定

打开 \Demonstrations\FPGA\DE1_SoC_IR\IR_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

 

对外输出数据