分享

红外接收

 昵称425425 2009-10-28
// 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
 
                           
                               
                               
                                               
                           
                   
                            
                                       
 
           
       
 
 
 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多