首页 红外接受FPGA

红外接受FPGA

举报
开通vip

红外接受FPGA // infrare.v //**功能描述:红外接收与解码模块,包括引导码,地址码,地址反码,数据码,数据反码。 module  infrare(led,                 out_data,                 clk,                 reset,                 IR                 );   input               IR;                             //红外接收头的ou...

红外接受FPGA
// 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,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_579277
暂无简介~
格式:doc
大小:58KB
软件:Word
页数:0
分类:互联网
上传时间:2018-09-09
浏览量:3