// 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 |
|