欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    基于FPGA的数字温度计(共19页).doc

    • 资源ID:14148219       资源大小:601KB        全文页数:19页
    • 资源格式: DOC        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    基于FPGA的数字温度计(共19页).doc

    精选优质文档-倾情为你奉上1 题目要求基本要求:基于FPGA设计一个测量室温的温度计,能够实时的显示温度。附加功能:、达到设置的预定温度值可报警;、统计温度测量期内的最高温以及最低温 提供硬件:cyclone EP1C6Q240C8N开发板开发板资源:按键四个;共阳数码管四位;PS2接口;USB接口;蜂鸣器;四位拨码开关;LCD1602;VGA接口;RS232接口;FLASH;SDRAM;2 设计方案(或设计分析)外设:鉴于要测量温度,而开发板没有测量温度的设备,所以最基本是要添加外设数字温度传感器ds18b20。.ds18b20外形与三极管一样,一只脚传输数据,另外两只脚分别接地与高电平使之工作。Ds18b20实时测得的室温将转化成9到2位的串行数据,对串行数据进行“翻译”就可以得出实时室温。传输途径:传输途径是指9到12位的串行数据传输,我们考虑两种传输途径,一种是无线传输,一种是有限传输。如果是无线传输就会使成品温度记的测温更加灵活方便,不局限于线的长度,但必须再增加外设,而且编程肯定会更难更复杂,所以我们的初始方案是第二种,就是有线传输,在实现了基本测温功能之后如果有时间就再设计无线发送接收的模块。连接:开发板上提供了众多的引脚,我们只需选择其中一个接口与ds18b20的传输脚连接,将开发板上的地和+5v与ds18b20的其他两脚连接就可完成外围电路的连接,这个虽然比较简单,但是在调试阶段我们的连接还是忽略了一点问题,这将在设计中遇到的问题中述说。程序的编写:程序的编写我们打算用模块化得方式。总的来说数字温度记程序的设计不算复杂,不分模块写下来应该也不会难以读懂,但模块化的程序编写的一个良好习惯,这样在编写复杂程序的时候才会调理清晰容易读懂,而且模块化有利于组内分工,充分调动大家,积极参与到课程设计中。而程序的分块将在模块实现中分析。附加功能:在实现基本测温功能的前提下,我们考虑使其功能更强大更切合实际,所以打算添加功能,一个是警报功能,就是温度达到某个设定的温度时使蜂鸣器响一声并使灯亮;另一个功能是最高温与最低温的记录,在不按按键的时候显示的是实时室温,在按下一个或者两个按键时可以分别显示温度计启动开始到目前为止的最高室温与最低室温。3 模块实现分析:首先要对DS18B20的外围电路进行配置:Ds18b20的工作方式看似简单,只是单线传输,直接解读,其实初始化与读写操作比较复杂,时序要求非常精确,如下面图片所示:初始化:读写:写时间隙当主机把数据线从逻辑高电平拉到逻辑低电平的时候,写时间隙开始。有两种写时间隙:写1 时间隙和写0 时间隙。所有写时间隙必须最少持续60s,包括两个写周期间至少1s 的恢复时间。I/O 线电平变低后,DS1820 在一个15s 到60s 的窗口内对I/O 线采样。如果线上是高电平,就是写1,如果线上是低电平,就是写0。主机要生成一个写1时间隙,必须把数据线拉到低电平然后释放,在写时间隙开始后的15s内允许数据线拉到高电平。主机要生成一个写 0 时间隙,必须把数据线拉到低电平并保持60s。读时间隙当从 DS1820 读取数据时,主机生成读时间隙。当主机把数据线从高高平拉到低电平时,写时间隙开始。数据线必须保持至少1s;从DS1820 输出的数据在读时间隙的下降沿出现后15s 内有效。因此,主机在读时间隙开始后必须停止把I/O 脚驱动为低电平15s,以读取I/O 脚状态(见图12)。在读时间隙的结尾,I/O 引脚将被外部上拉电阻拉到高电平。所有读时间隙必须最少60s,包括两个读周期间至少1s 的恢复时间。而对DS18B20的操作可以用下表表示:温度转换和插补(外部电源供电且只有一只 DS1820)控制器状态数据(LSB在前)内容TX复位复位脉冲TR存在存在脉冲TXCChSkip ROM 命令TX44hConvert T 命令RX<1个字节的数据>读 8 次忙标志。控制器一字节(或位)接一个字节读下去,直到数据为FFh(所有位都为1)TX复位复位脉冲RX存在存在脉冲TXCChSkip ROM 命令TXBehRead Scratchpad 命令RX<9个数据字节>读整个暂存器加上CRC;控制器重新计算从暂存读到的8 个数据字节的CRC,把计算的CRC 和读取的CRC 进行比较,如果相同,数据就是有效的。控制器存储温度值并分别存储计数寄存器的内容和每度计数值寄存器的内容,做为COUNT_REMAIN 和COUNT_PER_C。TX复位复位脉冲RX存在存在脉冲CPU 按手册中的方法计算温度值以得到更高的分辨力。时钟:为了在初始化程序的编写方面那些延时比较直观准确和七段显示管的显示正常工作,我们设置了两个时钟分频模块。把原开发板上5MHZ的始终频率分成1MHZ和10KHZ,前者为串行数据处理与ds18b20初始化模块提供时钟,后者为并行数据处理与显示模块提供时钟。并行数据处理与显示:数码管的温度显示方面,编程可以比较独立,而且单独编程容易查错,所以独立设置了一个模块。在后期的添加功能阶段,最高温与最低温记录与报警功能没有单独设置一个模块,而是根据实际直接在此模块上稍作改动。数码管的七段的七位输入是一样的,所以要在四个数码管上显示不同的数字需要逐个扫描,每个时钟周期只选通一个数码管,然后输入要显示的数字的七位码,这样由于视觉暂留时间,虽然每个数码管的显示是分别在四个周期的时间段,但看起来是同时显示的,这是显示的基本方式。如下:1 2 3 视觉所见: 123报警功能:报警功能的实现与最高最低温的记录原理差不多,对输入的十二位并行数据(温度的编码)进行检测,如果达到某个设定的温度就给蜂鸣器一个电平使其想一声并给led灯电平使其亮,而温度记录则要比较后一个输入的十二位数据与前一位十二位数据,看其表示的温度,比前一位大就把数据保存取代前一位最高,并设置按钮使其按下就显示此最高温度,比前一位小就把数据保存取代前一位最低,并设置不同按钮使其按下显示此最低温度。 串行数据处理与初始化:由于ds18b20的操作相对比较复杂,所以单独设置一个模块专门处理其初始化,鉴于数码管的显示模块设置时并行输入的,所以此模块兼备ds18b20的传输数据处理,把串行数据处理成并行数据。此模块的输入就一个是时钟,另一个就是ds18b20的串行实时温度代码(12位),其与ds18b20之间就一根线相连,实现对其初始化与数据就收,还要对接收的串行数据进行储存使之可以并行输出,以提供给显示模块。整机模块组合:时钟分频模块2时钟分频模块1时钟并行数据处理与显示模块串行数据处理与初始化模块Ds18b20另附各程序如下:时钟分频模块:1:-分频器生成一个频率为1MHz的时钟信号,- 以供显示及报警模块作为触发信号使用。LIBRARYIEEE;USE IEEE.STD_LOGIC_1164.ALL;entity clk_div isport( clk: in std_logic;clk_div: out std_logic);end entity;architecture behav of clk_div isbeginprocess(clk)variable count:integer range 0 to 50; begin if rising_edge(clk) thencount:=count+1;if count=50 then clk_div<='1'count:=0; -开发板内部时钟为50MHz,计数变量count=50 使时钟输出为1MHzelse clk_div<='0' -分频器以1MHz的频率置“1”其余保持低电平end if;end if;end process;end behav;2:-分频器生成一个频率为10000Hz的时钟信号,- 以供显示及报警模块作为触发信号使用。LIBRARYIEEE;USE IEEE.STD_LOGIC_1164.ALL;entity clk_div2 isport( clk: in std_logic;clk_div2: out std_logic);end entity;architecture behav of clk_div2 isbeginprocess(clk)variable count:integer range 0 to 5000; begin if rising_edge(clk) thencount:=count+1;if count=5000 then clk_div2<='1'count:=0;-开发板内部时钟为50MHz,计数变量count=5000 使时钟输出为10000Hzelse clk_div2<='0'-分频器以10000Hz的频率置“1”其余保持低电平end if;end if;end process;end behav;DS18B20初始化与串行数据处理模块:-温度传感器初始化以及命令的读写、温度检测library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity wendu_chuangan isport(clk:in std_logic; dq:inout std_logic; wendu:out std_logic_vector(15 downto 0);end wendu_chuangan;architecture behav of wendu_chuangan istype state_type is(s0,s1,s2,s3,s4,s5,s6,s7,write_0,write_1,write_01,write_11,read0,read1,read2,read3);signal state:state_type;signal reset:std_logic;signal i:integer range 0 to ;signal date:std_logic_vector(15 downto 0);beginwendu<=date;-内部暂存数据赋给“wendu”输出一个16位的数值process(clk,reset)-通常作用实现是变量i=i+1,而当reset=1,则i置“0” begin if (reset='1')then i<=0; elsif rising_edge(clk) then i<=i+1; end if; end process; process(clk) variable j:integer range 0 to 60; variable cnt:integer range 0 to 16; beginif (clk'event and clk='1') then case state is -s0-s4为初始化过程,包括复位和存在脉冲 when s0 => -对传感器输入一个拉低电平 dq<='0' reset<='1' state<=s1; when s1 => -保持低电平500s,之后释放传感器的数据I/O管脚并置高阻态 reset<='0' if(i=500)then dq<='Z' state<=s2; reset<='1' end if; when s2 => -等待45s reset<='0' if(i=45)then reset<='1' state<=s3; end if; when s3 => -如果检测到DQ输出低电平则跳转到s4,如果为高电平则跳转到s0 if(dq='0')then state<=s4; elsif(dq='1')then state<=s0; end if;when s4 => -保持存在低电平200s,之后跳转到s5reset<='0' if(i=200)then reset<='1' state<=s5; end if; when s5 => -命令写入 if(j=0 or j=1)then -写入命令CCh,即Skip ROM 命令 state<=write_0; j:=j+1; elsif(j=2 or j=3)then state<=write_1; j:=j+1;dq<='0' elsif(j=4 or j=5)then state<=write_0; j:=j+1; elsif(j=6 or j=7)then state<=write_1; j:=j+1;dq<='0' elsif(j=8 or j=9)then -写入命令44h,即Convert T 命令 state<=write_0; j:=j+1; elsif(j=10)then state<=write_1; j:=j+1;dq<='0' elsif(j=11)then state<=write_0; j:=j+1; elsif(j=12 or j=13)then state<=write_0; j:=j+1; elsif(j=14)then state<=write_1; j:=j+1;dq<='0' elsif(j=15)then state<=write_0; j:=j+1; elsif (j=16)then j:=20; state<=s6; dq<='Z' elsif(j=20 or j=21)then -写入命令CCh,即 Skip ROM 命令 state<=write_0; j:=j+1; elsif(j=22 or j=23)then state<=write_1; j:=j+1;dq<='0' elsif(j=24 or j=25)then state<=write_0; j:=j+1; elsif(j=26 or j=27)then state<=write_1; j:=j+1;dq<='0' elsif(j=28)then -写入命令BEh, 即Read Scratchpad 命令 state<=write_0; j:=j+1; elsif(j=29 or j=30 or j=31)then state<=write_1; j:=j+1;dq<='0' elsif(j=32 or j=33)then state<=write_1; j:=j+1;dq<='0' elsif(j=34)then state<=write_0; j:=j+1; elsif(j=35)then state<=write_1; j:=j+1;dq<='0' elsif(j=36)then state<=s7; j:=40; end if; when s6=> -写入命令44h后,释放DQ管脚,并等待750ms reset<='0' if (i= or dq='1')then state<=s0; reset<='1' end if;when write_0 => -主机生成一个写 0 时间隙,必须把数据线拉到低电平并保持70s。dq<='0' reset<='0' if (i = 70) then dq<='Z' -释放DQ管脚,使其有1s的恢复时间 reset<='1' state<=write_01; end if; when write_01 => state<=s5; when write_1=> -主机生成一个写“1”时间隙,必须把数据线拉到低电平然后释放,1s后把数据线DQ拉到高电平,并保持70s state<=write_11; when write_11 => dq<='1' reset<='0' if (i = 70) then reset<='1' state<=s5; end if; when s7=> -从DQ管脚读出连续串行的16个数值if (j < 55 ) then j:=j+1; state<=read0;cnt:=cnt+1; dq<='0' elsif (j = 55 ) then j:=60; state<=read0;cnt:=15;dq<='0' elsif (j = 60 ) then j:=0;state<=s0; end if; when read0=> -DQ写入一个低电平,此处等待1sstate <= read1; when read1=> -释放DQ,当10s后转到read2把读出的数值赋给寄存器datedq <= 'Z' reset<='0' if (i = 10) then reset<='1' state <= read2; end if; when read2=> date(cnt)<= dq; state <= read3; when read3=> -读时间隙再保持55s,合67sreset<='0' if (i = 55) then reset<='1' state<=s7; end if; when others =>state<=s0;end case;end if;end process;end behav;七段数码管显示外加温度记录与报警功能模块:-并行数据处理与显示模块LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_unsigned.all;USE ieee.std_logic_arith.all;entity d18b20 isGENERIC(LED_0:STD_LOGIC_VECTOR (7 DOWNTO 0):="" -LED驱动不包括小数点LED_1:STD_LOGIC_VECTOR (7 DOWNTO 0):=""LED_2:STD_LOGIC_VECTOR (7 DOWNTO 0):=""LED_3:STD_LOGIC_VECTOR (7 DOWNTO 0):=""LED_4:STD_LOGIC_VECTOR (7 DOWNTO 0):=""LED_5:STD_LOGIC_VECTOR (7 DOWNTO 0):="" LED_6:STD_LOGIC_VECTOR (7 DOWNTO 0):="" LED_7:STD_LOGIC_VECTOR (7 DOWNTO 0):="" LED_8:STD_LOGIC_VECTOR (7 DOWNTO 0):="" LED_9:STD_LOGIC_VECTOR (7 DOWNTO 0):="" LED0:STD_LOGIC_VECTOR (7 DOWNTO 0):="" -LED驱动包括小数点LED1:STD_LOGIC_VECTOR (7 DOWNTO 0):=""LED2:STD_LOGIC_VECTOR (7 DOWNTO 0):=""LED3:STD_LOGIC_VECTOR (7 DOWNTO 0):=""LED4:STD_LOGIC_VECTOR (7 DOWNTO 0):=""LED5:STD_LOGIC_VECTOR (7 DOWNTO 0):="" LED6:STD_LOGIC_VECTOR (7 DOWNTO 0):="" LED7:STD_LOGIC_VECTOR (7 DOWNTO 0):="" LED8:STD_LOGIC_VECTOR (7 DOWNTO 0):="" LED9:STD_LOGIC_VECTOR (7 DOWNTO 0):=""); port(clk,dip1,dip2:in std_logic; temp:in std_logic_vector(15 downto 0); led77:out std_logic_vector(7 downto 0); led44:out std_logic_vector(3 downto 0); led:out std_logic_vector(7 downto 0); beep:out std_logic);end entity;architecture behav of d18b20 issignal j:std_logic_vector(1 downto 0);signal led71:std_logic_vector(7 downto 0);signal led72:std_logic_vector(7 downto 0);signal led73:std_logic_vector(7 downto 0);signal led74:std_logic_vector(7 downto 0);type state_type is(s0,s1,s2,s3);signal state:state_type;signal r:std_logic_vector(15 downto 0);type state_type_first is(w0,w1,w2);signal state_first:state_type_first; begin counter:process(clk) begin if(clk'event and clk='1') then j<=j+1; end if; end process; scan:process(j) -根据j的不同,选择4只七段数码管选通 begin case j is when "00"=>led44<="0111" led77<=led71; when "01"=>led44<="1011" led77<=led72; when "10"=>led44<="1101" led77<=led73; when "11"=>led44<="1110" led77<=led74; end case; end process; led777:process(clk) variable me1,me2:std_logic_vector(15 downto 0); variable i:integer range 0 to 10000; begin if(clk'event and clk='1') then case state_first is when w0=> -等待1s后把从温度传感器的DQ管脚读入的16位数值,赋给me1,以及me2 i:=i+1; if(i=10000)then i:=0; me1:=temp;me2:=temp; state_first<=w1; end if; when w1 => -me1为检测通电时间内检测到的最高温,me2则为最低温 if(me1<temp)then me1:=temp; else me1:=me1; end if; if(me2>temp)then me2:=temp; else me2:=me2; end if; if(dip1='1')then -当dip1为高电平则数码管显示实时温度,当dip2为高电平则显示最高温,dip2为低电平则显示最低温r<=temp;elsif(dip2='1')thenr<=me1;elsif(dip2='0')thenr<=me2;end if;state_first<=w2;when w2 => - case r(11 downto 4)is -穷举读入数值temp的第511位,并置第一、二个数码管为相应的数字 when ""=>led71<=led_0;led72<=led0; when ""=>led71<=led_0;led72<=led1; when ""=>led71<=led_0;led72<=led2; when ""=>led71<=led_0;led72<=led3; when ""=>led71<=led_0;led72<=led4; when ""=>led71<=led_0;led72<=led5; when ""=>led71<=led_0;led72<=led6; when ""=>led71<=led_0;led72<=led7; when ""=>led71<=led_0;led72<=led8; when ""=>led71<=led_0;led72<=led9; when ""=>led71<=led_1;led72<=led0; when ""=>led71<=led_1;led72<=led1; when ""=>led71<=led_1;led72<=led2; when ""=>led71<=led_1;led72<=led3; when ""=>led71<=led_1;led72<=led4; when ""=>led71<=led_1;led72<=led5; when ""=>led71<=led_1;led72<=led6; when ""=>led71<=led_1;led72<=led7; when ""=>led71<=led_1;led72<=led8; when ""=>led71<=led_1;led72<=led9; when ""=>led71<=led_2;led72<=led0; when ""=>led71<=led_2;led72<=led1; when ""=>led71<=led_2;led72<=led2; when ""=>led71<=led_2;led72<=led3; when ""=>led71<=led_2;led72<=led4; when ""=>led71<=led_2;led72<=led5; when ""=>led71<=led_2;led72<=led6; when ""=>led71<=led_2;led72<=led7; when ""=>led71<=led_2;led72<=led8; when ""=>led71<=led_2;led72<=led9; when ""=>led71<=led_3;led72<=led0; when ""=>led71<=led_3;led72<=led1; when ""=>led71<=led_3;led72<=led2; when ""=>led71<=led_3;led72<=led3; when ""=>led71<=led_3;led72<=led4; when ""=>led71<=led_3;led72<=led5; when ""=>led71<=led_3;led72<=led6; when ""=>led71<=led_3;led72<=led7; when ""=>led71<=led_3;led72<=led8; when ""=>led71<=led_3;led72<=led9; when ""=>led71<=led_4;led72<=led0; when ""=>led71<=led_4;led72<=led1; when ""=>led71<=led_4;led72<=led2; when ""=>led71<=led_4;led72<=led3; when ""=>led71<=led_4;led72<=led4; when ""=>led71<=led_4;led72<=led5; when ""=>led71<=led_4;led72<=led6; when ""=>led71<=led_4;led72<=led7; when ""=>led71<=led_4;led72<=led8; when ""=>led71<=led_4;led72<=led9; when ""=>led71<=led_5;led72<=led0; when ""=>led71<=led_5;led72<=led1; when ""=>led71<=led_5;l

    注意事项

    本文(基于FPGA的数字温度计(共19页).doc)为本站会员(飞****2)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开