红外接受FPGA
// infrare.v
//**功能描述:红外接收与解码模块,包括引导码,地址码,地址反码,数据码,数据反码。
module infrare(led,
out_data,
clk,
reset,
IR
);
input IR; //红外接收头的ou...
// infrare.v
//**功能描述:红外接收与解码模块,包括引导码,地址码,地址反码,数据码,数据反码。
module infrare(led,
out_data,
clk,
reset,
IR
);
input IR; //红外接收头的out_data数据输出端芯片数据输入端
input clk;
input reset;
output [7:0]led; //显示led信号输出端
output out_data;
assign out_data=IR;
reg [7:0]led; //数据显示
reg cnt; //检波计数寄存器
reg end_flag ; //数据接收完成标志,“0”没完成,“1”完成
reg [31:0]data_reg; //数据寄存器
reg [4:0]state;
reg [4:0]bitcnt; //字节计数寄存器
wire div_clk;
//************************状态机描述状态*****************************
parameter guide_down=4'b0000,
guide_up=4'b0001,
number_down=4'b0010,
number_up=4'b0100,
number_judge=4'b1000;
//*****************************接收与解码模块*******************************
always @ (posedge div_clk)
begin
case(state)
guide_down: //引导码低电平4.5ms
begin
if(IR==1)
begin //检波计时
cnt<=cnt+1'b1;
end_flag<=0;
end
if(IR==0)
begin
if(cnt>7'd34&&cnt<7'd42) //给定的范围计数时间
begin
state<=guide_down; //转移下个状态
cnt<=0;
end
else
begin
cnt<=0;
state<=guide_up; //转回第一个状态
end
end
end
guide_up: //引导码高电平4.5ms
begin
if(IR==0)
begin //检波计时
cnt<=cnt+1'b1;
end
if(IR==1)
begin
if(cnt>7'd34&&cnt<7'd42) //给定计时范围
begin
state<=number_down; //转到下个状态
cnt<=0;
end
end
else
begin
cnt<=0;
state<=guide_down; //出错转回第一个状态
end
end
number_down: //"0"码和“1"码的低电平0.56ms
begin
if(IR==1)
begin
cnt<=cnt+1'b1;
end
if(IR==0)
begin
if(cnt<7'd6)
begin
state<=number_up;
cnt<=0;
end
else
begin
cnt<=0;
state<=guide_down; //出错返回初始状态
end
end
end
number_up:
begin
if(IR==0) //"0"获"1"的高电平判断,"0"为0.56ms,"1"为1.69ms
begin
cnt<=cnt+1'b1;
end
if(IR==1)
begin //计数范围以"1"的高电平1.69ms最大为准
if(cnt<7'd14)
begin
state<=number_judge; //进入"0"或"1"判断状态
end
else
begin
state<=guide_down; //出错进入初始状态
cnt<=0;
end
end
end
number_judge:
begin //"0"码判断
if(cnt<7'd6)
begin //"0"码
data_reg[bitcnt]<=1'b0;
cnt<=0; //清零重新计?
if(bitcnt==5'd31)
begin //满32个字节进入下一个编码
state<=guide_down;
end_flag<=1; //接收完成
bitcnt<=0; //字节计数器清零
end
else
begin //字节寄存器计数
bitcnt<=bitcnt+1'b1;
state<=number_down;
end
end
if(cnt>7'd12&&cnt<7'd14) //"1"码判断
begin //"1"接收
data_reg[bitcnt]<=1'b1;
cnt<=0; //检波寄存器清零
if(bitcnt==5'd31)
begin
state<=guide_down;
bitcnt<=0;
end_flag<=1;
end
else
begin
bitcnt<=bitcnt+1'b1;
state<=number_down;
end
end
end
default: state<=guide_down;
endcase
end
//*********************************LED解码显示模块**************************************
//****功能:用来显示8位的数据码
always @ (posedge end_flag)
begin
led<=data_reg[23:16];
end
div_clk div_clk_0(.div_clk(div_clk),
.clk(clk),
.reset(reset)
);
endmodule
//***************************分频模块***********************************
module div_clk(div_clk,
clk,
reset
);
input clk;
input reset;
output div_clk;
reg div_clk;
reg [14:0]divcnt;
always @(posedge clk or negedge reset)
begin
if(!reset)
begin
div_clk<=1'b0;
divcnt<=0;
end
else
if(divcnt==3000) //分频得到0.125ms的时钟
begin
div_clk<=~div_clk; //时钟产生
divcnt<=0;
end
else
begin
divcnt<=divcnt+1'b1; //计数
end
end
endmodule
本文档为【红外接受FPGA】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。