基于FPGA的红外编码解码器设计报告_第1页
基于FPGA的红外编码解码器设计报告_第2页
基于FPGA的红外编码解码器设计报告_第3页
基于FPGA的红外编码解码器设计报告_第4页
基于FPGA的红外编码解码器设计报告_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于fpga的红外编码解码器设计报告课程:计算机网络院系:控制科学与工程系班级:自动化0804班姓名:龚文 u200813582姚鹏 u200813591指导老师:何顶新时间:2011年3月1.引言红外线遥控是目前使用最广泛的一种通信和遥控手段。由于红外线遥控装置具有体积小、功耗低、功能强、成本低等特点,因而,继彩电、录像机之后,在录音机、音响设备、空凋机以及玩具等其它小型电器装置上也纷纷采用红外线遥控。工业设备中,在高压、辐射、有毒气体、粉尘等环境下,采用红外线遥控不仅完全可靠而且能有效地隔离电气干扰。本红外解码设计基于fpga verilog hdl语言,在altera de 教学开发板利

2、用红外端口收发器(irda transceiver)进行实验。2.红外编码原理2.1红外遥控系统通用红外遥控系统由发射和接收两大部分组成,应用编/解码专用集成电路芯片来进行控制操作,如下图所示。发射部分包括键盘矩阵、编码调制、led红外发送器;接收部分包括光、电转换放大器、解调、解码电路。矩阵键盘编码调制红外发射光/电放大解调解码2.2红外编码格式现有的红外遥控包括两种方式:pwm(脉冲宽度调制)和ppm(脉冲位置调制)。两种形式编码的代表分别为nec 和philips 的rc-5、rc-6 以及将来的rc-7。pwm(脉冲宽度调制):以发射红外载波的占空比代表“0”和“1”。为了节省能量,一

3、般情况下,发射红外载波的时间固定,通过改变不发射载波的时间来改变占空比。例如常用的电视遥控器,使用nec upd6121,其“0”为载波发射0.56ms,不发射0.56ms;其“1”为载波发射0.56ms,不发射1.68ms;此外,为了解码的方便,还有引导码,upd6121 的引导码为载波发射9ms,不发射4.5ms。upd6121 总共的编码长度为108ms。但并不是所有的编码器都是如此,比如toshiba 的tc9012,其引导码为载波发射4.5ms,不发射4.5ms,其“0”为载波发射0.52ms,不发射0.52ms,其“1”为载波发射0.52ms,不发射1.04ms。ppm(脉冲位置调

4、制):以发射载波的位置表示“0”和“1”。从发射载波到不发射载波为“0”,从不发射载波到发射载波为“1”。其发射载波和不发射载波的时间相同,都为0.68ms,也就是每位的时间是固定的。通过以上对编码的分析,可以得出以某种固定格式的“0”和“1”去学习红外,是很有可能不成功的。即市面上所宣传的可以学习64 位、128 位必然是不可靠的。另外,由于空调的状态远多于电视、音像,并且没有一个标准,所以各厂家都按自己的格式去做一个,造成差异更大。比如:美的的遥控器采用pwm 编码,码长120ms 左右;新科的遥控器;也采用pwm 编码,码长500ms 左右。如此大的差异,如果按“位”的概念来讲,应该是多

5、少位呢?64位128位显然都不可能包含如此长短不一的编码。23红外遥控编码格式红外遥控器的编码格式通常有两种格式:nec 和rc5nec 格式的特征:1:使用38 khz 载波频率2:引导码间隔是9 ms + 4.5 ms3:使用16 位客户代码4:使用8 位数据代码和8 位取反的数据代码nec 协议通过脉冲串之间的时间间隔来实现信号的调制(英文简写ppm)。逻辑“0”是由0.56ms的38khz 载波和0.560ms 的无 载波间隔组成;逻辑“1”是由0.56ms 的38khz 载波和1.68ms 的无载波间隔组成;结束位是0.56ms 的38k 载波。rc5 编码相对简单一些:同样由于取自

6、红外接收头的波形需要反相一下波形以便于分析:第一位是起始位s 通常是逻辑1第二位是场位f 通常为逻辑1,在rc5 扩展模式下它将最后6 位命令代码扩充到7 位代码(高位msb),这样可以从64 个键值扩充到128 个键值。第三位是控制位c 它在每按下了一个键后翻转,这样就可以区分一个键到底是一直按着没松手还是松手后重复按。3.红外接收装置3.1红外接收器参数altera de 教学开发板红外端口收发器(irda transceiver)参数如下:·拥有一个115.2kb/s 的红外收发器·32ma led 驱动电流· 集成电磁干扰屏蔽·iec825-1

7、1级眼保护·边沿侦测输入红外端口收发器de2板可以提供简单无线通讯媒体,其中利用了agilent hsdl-3201低能量红外线收发器。注意本设备支持的最高传输速度是115.2kbit/s,发送方和接受方传输速度必须相同。详细参考资料3.2红外解码原理遥控器发射的信号由一串0 和1 的二进制代码组成。不同的芯片对0 和1 的编码有所不同。通常有曼彻斯特编码和脉冲宽度编码。hs6221 的0 和1 采用pwm 方法编码,即脉冲宽度调制,0 码由0.56ms 低电平和0.565ms 高电平组合而成,脉冲宽度为1125ms。1码由056ms 低电平和1.69ms 高电平组合而成。脉冲宽度为

8、225ms。在编写解码程序时,通过判断脉冲的宽度,即可得到0 或1。hs6221 以及同类的芯片的数据格式包括引导码(起始码),用户码(地址码),用户反码(地址反码),数据码,数据反码,编码总共32 位,数据反码是数据码反相后的编码,用户反码原理一样,可以用来对数据的纠错。具体格式如下:当我们按下遥控器的按键时,遥控器将发出如上图的一串二进制代码,我们称它为一帧数据。根据各部分的功能。可将它们分为5 部分,分别为引导码、用户码、用户反码、数据码、数据反码。遥控器发射代码时,均是低位在前。高位在后。由图中分析可以得到,引导码高电平为9ms,低电平为4.5ms,当接收到此码时,表示一帧数据的开始。

9、fpga 可以准备接收下面的数据。地址码由8 位二进制组成,共256 种,图中用户反码主要是加强遥控器的可靠性,不同的设备可以拥有不同的地址码。因此,同种编码的遥控器只要设置地址码不同,也不会相互干扰。在同一个遥控器中,所有按键发出的地址码都是相同的。数据码为8 位,可编码256 种状态,代表实际所按下的键。数据反码是数据码的各位求反,通过比较数据码与数据反码,可判断接收到的数据是否正确。如果数据码与数据反码之间的关系不满足相反的关系,则本次遥控接收有误,数据应丢弃。在同一个遥控器上。所有按键的数据码均不相同。4.程序设计4.1程序结构及源代码本程序主要功能是接收红外,并且解码,然后在四个数码

10、管上显示出来(32位码)。主程序分为以下几个模块:分频和计数、状态机、数码管显示。分频计数部分主要实现50mz与采样频率的同步问题,使得采样频率满足红外接收器的要求,同频率输入存储;状态机部分主要依据红外编码规则,实现红外编码的解码,利用状态转换方式区分不同区域的红外编码,从而实现相应的译码。数码管显示部分主要是将接受并解码后的编码转换成七段码由数码管进行显示,此处利用了de2 底层函数实现,具体函数参加de2光盘。程序如下:module ir(clk,rst_n,ir,led_cs,led_db); input clk; input rst_n; input ir; output 7:0 l

11、ed_cs; output 7:0 led_db; reg 3:0 led_cs; reg 7:0 led_db; reg 7:0 led1,led2,led3,led4; reg 15:0 irda_data; / save irda data,than send to 7 segment led reg 31:0 get_data; / use for saving 32 bytes irda data reg 5:0 data_cnt; / 32 bytes irda data counter reg 2:0 cs,ns; reg error_flag; / 32 bytes data期

12、间,数据错误标志 /- reg irda_reg0; /为了避免亚稳态,避免驱动多个寄存器,这一个不使用。 reg irda_reg1; /这个才可以使用,以下程序中代表irda的状态 reg irda_reg2; /为了确定irda的边沿,再打一次寄存器,以下程序中代表irda的前一状态 wire irda_neg_pulse; /确定irda的下降沿 wire irda_pos_pulse; /确定irda的上升沿 wire irda_chang; /确定irda的跳变沿 always (posedge clk) /在此采用跟随寄存器 if(rst_n) begin irda_reg0 &

13、lt;= 1'b0; irda_reg1 <= 1'b0; irda_reg2 <= 1'b0; end else begin irda_reg0 <= ir; irda_reg1 <= irda_reg0; irda_reg2 <= irda_reg1; end assign irda_chang = irda_neg_pulse | irda_pos_pulse; /ir接收信号的改变,上升或者下降 assign irda_neg_pulse = irda_reg2 & (irda_reg1); /ir接收信号irda下降沿 a

14、ssign irda_pos_pulse = (irda_reg2) & irda_reg1; /ir接收信号irda上升沿 /- /设计分频和计数部分:从pt2222的规范中我们发现最小的电平持续0.56ms,而 /我们在进行采样时,一般都会对最小电平采样16次。也就是说要对0.56ms最少采样 /16次。 / 0.56ms/16=35us /de2开发板信号频率为50mhz,即时钟周期为20ns,所以我们需要的分频次数为: / 35000/20=1750 /在设计中我们利用了两个counter,一个counter用于计1750次时钟主频; /一个counter用于计算分频之后,同一

15、种电平所scan到的点数,这个点数最后会用来判断 /是leader的9ms 还是4.5ms,或是数据的 0 还是 1。 /- reg 10:0 counter; /分频1750次 reg 8:0 counter2; /计数分频后的点数 wire check_9ms; / check leader 9ms time wire check_4ms; / check leader 4.5ms time wire low; / check data="0" time wire high; / check data="1" time /- /分频1750计数 al

16、ways (posedge clk) if (rst_n) counter <= 11'd0; else if (irda_chang) /irda电平跳变了,就重新开始计数 counter <= 11'd0; else if (counter = 11'd1750) counter <= 11'd0; else counter <= counter + 1'b1; /- always (posedge clk) if (rst_n) counter2 <= 9'd0; else if (irda_chang) /i

17、rda电平跳变了,就重新开始计点 counter2 <= 9'd0; else if (counter = 11'd1750) counter2 <= counter2 +1'b1; assign check_9ms = (217 < counter2) & (counter2 < 297); /257 为了增加稳定性,取一定范围 assign check_4ms = (88 < counter2) & (counter2 < 168); /128 assign low = (6 < counter2) &

18、; (counter2 < 26); / 16 assign high = (38 < counter2) & (counter2 < 58); / 48 /- / generate statemachine 状态机 parameter idle = 3'b000, /初始状态 leader_9 = 3'b001, /9ms leader_4 = 3'b010, /4ms data_state = 3'b100; /传输数据 always (posedge clk) if (rst_n) cs <= idle; else cs &

19、lt;= ns; /状态位 always ( * ) case (cs) idle: if (irda_reg1) ns = leader_9; else ns = idle; leader_9: if (irda_pos_pulse) /leader 9ms check begin if (check_9ms) ns = leader_4; else ns = idle; end else /完备的if-else- ;防止生成latch ns =leader_9; leader_4: if (irda_neg_pulse) / leader 4.5ms check begin if (che

20、ck_4ms) ns = data_state; else ns = idle; end else ns = leader_4; data_state: if (data_cnt = 6'd32) & irda_reg2 & irda_reg1) ns = idle; else if (error_flag) ns = idle; else ns = data_state; default: ns = idle; endcase /状态机中的输出,用时序电路来描述 always (posedge clk) if (rst_n) begin data_cnt <=

21、6'd0; get_data <= 32'd0; error_flag <= 1'b0; end else if (cs = idle) begin data_cnt <= 6'd0; get_data <= 32'd0; error_flag <= 1'b0; end else if (cs = data_state) begin if (irda_pos_pulse) / low 0.56ms check begin if (!low) /error error_flag <= 1'b1; end

22、else if (irda_neg_pulse) /check 0.56ms/1.68ms data 0/1 begin if (low) get_data0 <= 1'b0; else if (high) get_data0 <= 1'b1; else error_flag <= 1'b1; get_data31:1 <= get_data30:0; data_cnt <= data_cnt + 1'b1; end end always (posedge clk) if (rst_n) irda_data <= 16'

23、;d0; else if (data_cnt =6'd32) & irda_reg1) begin led1 <= get_data7:0; /数据反码 led2 <= get_data15:8; /数据码 led3 <= get_data23:16;/用户码 led4 <= get_data31:24; end /-/四个数码管共用一个8位数据线,所以采用四个数码管快速轮流显示的方法/initial led_cs = 4'b0001;integer i="0"always (posedge clk)begin if(rst_

24、n) begin led_cs <= 4'b0001; end else if(i=2000) begin if (led_cs=4'b1000) begin led_cs<=4'b0001; i<=0; end else begin led_cs<=led_cs <<1; i<=0; end end else i<=i+1; end/-/四个数码管分别显示不用的数/initial led_db = 8'hff;always (posedge clk)if(rst_n)begin led_db <= 0'hff;/共阳数码管复位endelsebegin if (led_cs=4'b0001) led_db<= led1;/ if (led_cs=4'b0010) led_db<= led2; / if (led_cs=4'b0100) led_

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论