实验器材
Quartus ii 18.0
小梅哥AC620开发板
红外遥控器
实验背景
红外线遥控器利用波长为0.76μm ~ 1.5 μm 的近红外线来传送信号。红外线的特点是不干扰其他电器设备工作,也不会影响周边环境。比如不同的电视遥控器只能控制对应的电视,这是因为不同的电视遥控器对应一个不同的地址。不同的家用电器有不同的编码方式,统称为红外遥控器编码传输协议,使用最多的为NEC协议。
实验原理
红外发射部分电路包括矩阵键盘,红外发光二极管,编码以及调制电路,这些都已经集成在红外遥控器上(遥控器示意图如下图所示)。接收部分包括光敏二极管,解调以及解码电路。在本实验中,我们仅需要对其输出的信号进行解码操作。
NEC协议
HT6221为Holtek公司生产的一款基于NEC红外通信协议的遥控编码芯片,采用Pulse Position Modulation(PPM)进行编码。HT6221芯片的红外遥控发送一次数据的数据帧定义如下图所示:一帧数据:帧头,16位地址码,8位数据码,8位数据反码以及1bit结束位(可忽略)组成。
数据发送:
引导码由9ms高电平和4.5ms的低电平构成,代码一个数据帧的帧头;
地址码由16位地址构成,低8位在前,高8位在后(对于一个红外遥控器,地址为固定值)。所以NEC协议理论上能最多支持65536个不同的用户。
数据码由数据原码和数据反码构成(可以通过比较这两个8位数据检测数据接收是否正确)。所以理论上支持256种指令。
数据发送0/1:
数据发送1: 560μs高电平+1.69ms低电平
数据发送0: 560μs高电平+560μs低电平
数据接收:
对于数据接收端,接收到信号之后再输出的波形和输入端发送的波形反相。因此对于FPGA中接收端输出的波形为: 9ms低+4.5ms高 + 0.56ms 低+ 1.69ms高(1)/ 0.56ms高(0)。本模块就是检测此波形然后输出数据(由于红外传感器的品质不同,因此本模块的检测时间为一个区间范围)
当按键长按时输出的波形如下图所示,本模块只进行短按时数据波形设计。
VHDL代码实现
由于红外遥控器按键的时序和接收端不同,因此需要先对接收到的红外信号进行时钟同步(采用两级FF):
process(clk,nrst)
begin
if(nrst = '0')then
IR_temp1 <= '0';
IR_temp2 <= '0';
elsif( rising_edge(clk)) then
IR_temp1 <= iIR;
IR_temp2 <= IR_temp1;
end if;
end process;
对同步的输入信号进行边沿检测(和上面代码一致):
process(clk,nrst)
begin
if(nrst = '0')then
edge_temp1 <= '0';
edge_temp2 <= '0';
elsif( rising_edge(clk)) then
edge_temp1 <= IR_temp2;
edge_temp2 <= edge_temp1;
end if;
end process;
pose_edge <= (not edge_temp2) and edge_temp1;
fall_edge <= edge_temp2 and (not edge_temp1);
时钟计数器(用于9ms, 4.5ms, 1.69ms, 0.56ms的计数)
process(clk,nrst)
begin
if(nrst = '0')then
cnt <= 0;
elsif(rising_edge(clk))then
if(cnt_en = '1') then
cnt <= cnt + 1;
else
cnt <= 0;
end if;
end if;
end process;
计数时间超时(当计数器的时间已经超过10ms说明出现错误)timeout标志信号
process(clk,nrst)
begin
if(nrst = '0')then
timeout <= '0';
elsif(rising_edge(clk))then
if(cnt > 500000) then -- cnt >10 ms超时信号置1
ti