您的位置:控制工程论坛网论坛 » 嵌入式系统 » 基于NIOSⅡ的自动温控系统

强强

强强   |   当前状态:离线

总积分:4136  2025年可用积分:0

注册时间: 2007-08-18

最后登录时间: 2008-03-03

空间 发短消息加为好友

基于NIOSⅡ的自动温控系统

强强  发表于 2007/9/14 11:55:15      2343 查看 6 回复  [上一主题]  [下一主题]

手机阅读

第一章        

1.1开发背景简介

Altera公司在可编程系统级芯片(SOPC)领域中处于前沿和领先的地位,其2003年度的年收入高达8.272亿美元.其产品向全世界近14,000家客户提供超值的可编程解决方案。 Altera®大学计划为全球范围内的大专院校提供先进的开发软件、可编程逻辑器件、开发工具以及完整的设计套件,有效地补充了现有的数字逻辑设计教学.所提供的软件和硬件平台适合于各种设计课程的使用,包括入门级的逻辑设计和高级的计算构架。

NiosⅡ处理器能从外设和存储器接口库中进行选择,将处理器、外设、存储器和I/O接口集成在单片FPGA中,定制自己设计的系统,并且对各种外围设备的实现提供了强大的支持平台;SOPC Builder系统开发工具可以自动生成组件以及联接组件的总线,所有软件开发任务编辑、构建、程序调试都能够在(IDE)下完成,从而简化了开发过程,降低了系统成本、复杂性以及功耗,并且通过移植到Altera的结构化ASIC中,实现低成本、大批量产品。具有可配置,长生命周期、低成本、高性能等优点,是世界上最通用的处理器。

SOPCSystem on a programmable Chip,片上可编程系统)是Altera公司提出的一种灵活、高效的SOC解决方案。它将处理器、存储器、I/O接口、LVDSCDR等系统设计需要的功能模块集成到一个PLD器件上,构建一个可编程的片上系统。它是可编程系统,具有灵活的设计方式,软硬件可裁减、可扩充、可升级,并具备软硬件在系统可编程的功能。可编程器件内还有小容量高速RAM资源。由于市场上有丰富的IPCore资源可供灵活选择,用户可以构成各种不同的系统,如单处理器、多处理器。有些可编程器件内还可以包含可编程模拟电路。除了系统使用的资源外,可编程器件内还有足够的可编程逻辑资源,用于实现其它附加逻辑。

本学期作者选修了“微机应用系统”课程,通过学习及上机实践对嵌入式系统有了全面的了解和一定程度的掌握,结合教学,做了大量的市场调研,我们的参赛作品选用的就是Altera公司的NiosII软核嵌入式处理器。

1.2产品描述

本设计采用NiosⅡ软核嵌入式处理器,通过按键选择功能设置,18B20将外界温度信号直接转换成串行数字信号传给NIOS处理器处理,NiosⅡ处理器把接收到的温度数据与设置的中心温度相比较,如果外界温度低于中心设置温度一定幅度,则将连接加热器的电路导通,从而起到升温作用,当温度高于中心设置温度的一定幅度时,连接洒水器的电路导通,从而起到降温的作用,时间与温度可以通过LED每隔一分钟显示一次。

 

1.3市场前景

    在现代生活生产中,自动控制有着举足轻重的作用。采用自动控制,能够大大减少人力,节省了时间,提高了生产效率,降低了生产成本。随着高科技农业的飞速发展,人们对健康食品的需求越来越大。本设计的产品能够实现自动温度控制和洒水功能,在许多家用、工业生产、农业生产领域有着广泛的应用,如自动温控孵化器、自动温控烤箱、自动温控洒水豆芽机控制器和超市蔬菜保鲜等安全卫生,并且有着很高的稳定性和精确性,不仅节省了人力资源,更避免了由于人为的疏忽造成的损失,大大提高了产品质量和生产效率,具有广阔的市场前景。

1.4 产品特色

    本产品是在SOPC上开发的,采用NiosⅡ软核嵌入式处理器为控制中心,可以根据用户的需求灵活地进行设计。与以单片机为处理器的系统相比,功能更为强大,操作更为简单灵活。由于NiosⅡ处理器可以重新设计下载,所以产品升级、功能扩展易于实现。还可以根据不同的实际应用进行功能添加,增强了产品的应用领域,可方便地根据用户的需求为用户量身订制产品。

 

第二章  开发方法

本设计以NiosⅡ处理器为核心,采用软、硬件结合的方法进行开发。

2.1硬件开发方法 

SOPC Builder系统综合软件来选取合适的CPU、存储器及外围器件,并定制它们的功能。

使用QuartusⅡ软件选取Cyclone系列,并对SOPC Builder生成的HDL设计文件进行布局布线;再使用QuartusⅡ选取EP1C3T144C8并对NiosⅡ系统上的各种I/O分配管脚,另外还要根据要求进行硬件编译选项或时序约束的设置。在编译的过程中,QuartusⅡ从HDL源文件综合生成一个适合目标器件的网表。最后,生成配置文件。

使用QuartusⅡ编程器和Altera下载电缆,将配置文件下载到开发板上。当校验完当前硬件设计后,还可再次将新的配置下载到开发板上的非易失存储器里。

2.2软件开发方法

在用SOPC Builder系统集成软件进行硬件设计的同时,就可以开始编写独立于器件的C软件。

SOPC Builder为每个新创建的Nios CPU 生成一个定制软件开发包(SDK)。SDK为用户提供软件开发的基础,SDK内有与外设相关的子程序被编译后生成的编译库

使用Nios SDK对软件进行编译、调试。

将硬件设计下载到开发板上后,就可以将软件下载到开发板上并在硬件上运行

     

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1楼 0 0 回复
  • 强强

    强强   |   当前状态:离线

    总积分:4136  2025年可用积分:0

    注册时间: 2007-08-18

    最后登录时间: 2008-03-03

    空间 发短消息加为好友

    强强   发表于 2007/9/14 11:51:00

    第三章  系统功能及技术指标 




     



    3.1系统功能 



    采用NiosⅡ软核嵌入式处理器控制,使用高精度数字温控传感器测量温度,实现数码显示、全自动加温和洒水控制、实时电子时钟等功能。温度中心值和精度值可在一定范围内随意设置,洒水时间与洒水间隔时间也可以在一定范围内随意设置。系统安全可靠,操作简单易行。 



       该设计还配置了两个电源插座(220/110V),用来连接加热器和洒水电磁阀。此外,还设计了电源、洒水和加温三个指示灯,SET+-OK四个按键设置开关。本系统可以用作其他设备的电加温和定时电磁阀控制设备,应用广泛。 



       SET按键为设置功能选择键,每按下一次,改变一次功能设置。分别为中心温度设置、控制精度设置、洒水时间设置、洒水间隔时间设置、时钟校准和退出设置,循环执行。 



       +”按键为显示闪动数据加1键。 



       -”按键为显示闪动数据减1键。 



       OK”按键为设置确定键,在每一项功能设置中分为两部分,即小数设置和整数设置。如中心温度设置分为小数和整数,首先进入小数设置,‘+’或‘-’到所需数值后,按一次‘OK’键确定。然后进入整数设置。整数设置好后,按一次‘OK’键,小数、整数都不闪动为数据确定。 



        另外在未进入功能设置时,或设置完成退出设置后,按一次‘OK’键,可强制洒水或停止洒水,依据当时是否在洒水而定。当从未洒水进入洒水时,等一个洒水间隔时间(原始设计为30秒)自动过去后就改变了以后洒水时间的设置,用当前小时数加一间隔时间数,计算下一次洒水时间,以此类推。如不到一个洒水时间又按一次‘OK’键,退出洒水,不改变下次洒水时间的设置。 



    本设计的核心器件为NIOSⅡ软核处理器,通过与外围电路(包括外界温度接收电路、自动加热电路、自动洒水电路、掉电保护电路、报警电路、LED显示电路、电源指示电路)连接,实现自动温控和洒水功能,由于具有实时时钟的控制,可以实现高度的精确性。 




    3.2技术指标 



    电源:                220/110V 



    中心温度控制范围:    20----99.9 



        控温精度设置范围:    0.1----9.9 



        洒水时间设置范围:    01----959 



        洒水间隔时间设置范围:1小时----23小时 



    本产品的初始设置为: 



    中心温度:       25 



        控温精度:   -3----+3 



        洒水时间:       30 



        洒水间隔时间:   6小时 





     



    第四章   硬件的设计与实现 




     



    4.1硬件设计思想 



    单线数字温度传感器DS18b20将外界温度信号直接转换成串行数字信号传给NIOSⅡ处理器处理,NIOSⅡ处理器对接收到的数据进行处理,控制LED显示、加热器工作、洒水器工作、指示灯显示和报警器工作。从而实现系统的自动温度控制和洒水等功能。 




    4.2 硬件设计 



    基于NIOSⅡ的自动温控系统的硬件框图如图4.1所示。


     


                      图4.1   硬件设计框图





     



    4.2.1温度传感器DS18B20 



         DALLAS最新单线数字温度传感器DS18B20是新的一线器件,体积更小、适用电压更宽、更经济。一线总线独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。DS18B20可把温度信号直接转换成串行数字信号供微机处理,支持一线总线接口,测量温度范围为 -55°C~+125°C,在-10~+85°C范围内,精度为±0.5°C。现场温度直接以一线总线的数字方式传输,大大提高了系统的抗干扰性。由于每片DS18B20含有唯一的硅串行数所以在一条总线上可挂接任意多个DS18B20芯片。从DS18B20读出的信息或写入DS1820的信息,仅需要一根口线(单线接口)。读写及温度变换功率来源于数据总线,总线本身也可以向所挂接的DS18B20供电,而无需额外电源。DS18B20提供九位温度读数,构成多点温度检测系统而无需任何外围硬件。并且适合于恶劣环境的现场温度测量,如:环境控制、设备或过程控制、测温类消费电子产品等。DS18B20的性能是新一代产品中最好的。性能价格比也非常出色。DS18B20开辟了温度传感器技术的新概念。DS18B20使电压、特性及封装有更多的选择,让我们可以构建适合自己的经济的测温系统。 



    1DS18B20的特性: 



        ·单线接口:仅需一根接口线与MCU 



    ·无需外围元件 



        ·由总线提供电源 



        ·测温范围为-55℃75℃,精度为0.5℃ 



        ·九位温度读数 



        ·A/D变换时间为200ms 



        ·用户自设定温度报警上下限,其值是非易失性的 



    ·报警搜索命令可识别哪片DS1820超温度限 



    2 DS18B20的内部结构 



         内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器THTL、配置寄存器。DS18B20的管脚排列如图4.2所示。 




     


                 图4.2  DS18B20的管脚排列图





     




     



    ● GND为电源地; 



    ● DQ为数字信号输入/输出端 



    ● VDD为外接供电电源输入端(在寄生电源接线方式时接地)。 



          光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码。64位光刻ROM的排列是:开始8位(28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。 



          DS18B20中的温度传感器可完成对温度的测量,以12位转化为例:16位符号扩展的二进制补码读数形式提供,以0.0625℃/LSB形式表达,其中S为符号位。 






     


    4.3  12位转化数据




    4.312位转化后得到的12位数据,存储在DS18b20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的 



    例如+125℃的数字输出为07D0H+25.0625℃的数字输出为0191H-25.0625℃的数字输出为FF6FH-55℃的数字输出为FC90H,如表4.1所示。 



    4.1 二进制和十六进制表示温度 






     


     3DS18B20温度传感器的存储器




        DS18B20温度传感器的内部存储器包括一个高速暂存RAM和一个非易失性的可电擦除的E2RAM,后者存放高温度和低温度触发器THTL和结构寄存器。 



        暂存存储器包含了8个连续字节,前两个字节是测得的温度信息,第一个字节的内容是温度的低八位,第二个字节是温度的高八位。第三个和第四个字节是THTL的易失性拷贝,第五个字节是结构寄存器的易失性拷贝,这三个字节的内容在每一次上电复位时被刷新。第六、七、八个字节用于内部计算。第九个字节是冗余检验字节。 



    该字节各位的意义如下:TM R1 R0 1 1 1 1 1 



    低五位一直都是1 TM是测试模式位,用于设置DS18B20在工作模式还是在测试模式。在DS18B20出厂时该位被设置为0,用户不要去改动。R1R0用来设置分辨率,如下表所示:(DS18B20出厂时被设置为12位) 



    4)测温原理:内部计数器对一个受温度影响的振荡器的脉冲计数,低温时振荡器的脉冲可以通过门电路,而当到达某一设置高温时振荡器的脉冲无法通过门电路。计数器设置为-55℃时的值,如果计数器到达0之前,门电路未关闭,则温度寄存器的值将增加,这表示当前温度高于-55℃。同时,计数器复位在当前温度值上,电路对振荡器的温度系数进行补偿,计数器重新开始计数直到回零。如果门电路仍然未关闭,则重复以上过程。温度表示值为9bit,高位为符号位,其结构如图4.4所示: 






     


     


      4.4 温度表示值的结构图


    2楼 回复本楼

    引用 强强 2007/9/14 11:51:00 发表于2楼的内容

  • 强强

    强强   |   当前状态:离线

    总积分:4136  2025年可用积分:0

    注册时间: 2007-08-18

    最后登录时间: 2008-03-03

    空间 发短消息加为好友

    强强   发表于 2007/9/14 11:51:53

    4.2.2 LED数码管 



    LED数码管根据LED的接法不同分为共阴和共阳两类,  如图4.5所示, 将多只LED的阴极连在一起即为共阴式,而将多只LED的阳极连在一起即为共阳式。以共阴式为例,如把阴极接地,在相应段的阳极接上正电源,该段即会发光。当然,LED的电流通常较小,一般均需在回路中接上限流电阻。假如我们将"b""c"段接上正电源,其它端接地或悬空,那么"b""c"段发光,此时,数码管显示将显示数字1”。而将"a""b""d""e""g"段都接上正电源,其它引脚悬空,此时数码管将显示2”。其它字符的显示原理类同。在本设计中选用共阳式。 







     


     


     


     


     


    4.5 七段译码器原理 



    4.2.3掉电保护电路 



    如果220V不能正常供电,就需要使用如图4.6所示的掉电保护电路。 







     


     


     


     


     


     


     


                                     4.6 掉电保护电路 



    4.2.4温度控制电路 



    如图4.7所示,当外界温度低于中心设置温度一定幅度时,EP1C3T144C871引脚输出一个低电平,开关K2被吸合,电路到通,则与此电路连接的加热器开始工作,从而起到升温的作用。 




                


     


     


     


     


     


     


     


      


    4.7 温度控制电路 




     



    4.2.5自动洒水控制 



    如图4.8所示,当外界温度高于中心设置温度一定幅度时,EP1C3T144C867引脚输出一个低电平,开关K1被吸合,电路导通,则与此电路连接的洒水器开始工作,从而起到降温的作用,洒水器工作的时间由按键的设置决定。 



                     


     


     


     


     


     


     


     


    4.8 洒水控制电路 




     




     



    4.3 NIOSⅡ处理器连接及管脚分配 



        管脚分配按照NiosⅡ开发板外接引脚功能表进行连接。 




     



    4.3.1 NIOSⅡ处理器 



          Nios II嵌入式处理器是一个用户可配置的通用RISC嵌入式处理器。它的易用性和灵活性使它成为世界上最流行的嵌入式处理器之一。Nios处理器可用于多个功能强大的开发套件,它包括一个标准外设库Altera提供功能丰富、易于使用的Nios II处理器组合开发包。开发包为您生成完整片上可编程系统(SOPC)解决方案,提供所需的一切工具。Nios II开发套件包括一个常用外围设备及接口库,这个库在Altera  FPGA中可免费使用。用户开发的外围设备和接口可以通过引入向导轻松地引入到Nios II 处理器系统中,为设计再利用提供了一种简便的方法。 




     



    4.3.2 Nios II外围设备及接口 



    Nios II外围设备及接口如表4.2所示。 









     



    4.2  Nios II外围设备及接口 









































    外围设备 



    说明 



    JTAG UART 



    通过内嵌在Altera FPGA内部的联合测试行动组(JTAG)电路,在PC主机和SOPC Builder系统之间进行串行字符流通讯 



    CompactFlash Interface 



    提供大容量存储支持 



    用户逻辑接口 



    将片内用户逻辑或片外器件连接到SOPC Builder生成的系统中 



    UART 



    提供通用串行接口,具可变波特率、奇偶校验、停止和数据位及可选的流量控制信号 



    间隔时钟 



    提供32比特时钟,可作为周期脉冲发生器或系统看门狗时钟 



    并行I/O接口 



    提供1比特到32比特的并行I/O接口(输入、输出、边缘采样



    串行外围设备接口(SPI) 



    实现工业标准串行外围设备接口,支持主设备或从设备协议 



    DMA控制器 



    与存储器进行批量数据交换,减轻CPU的负担 



    SDRAM控制器 



    提供一个简单Avalon™接口,与片外的SDRAM沟通,支持8163264比特数据宽度 



    存储器接口 



    包括: 




    以太网端口 



    包括: 




    • 10/100兆比特每秒SMSC LAN91C111单芯片以太网控制器 


    • 提供轻量级的IP TCP/IP协议栈的软件支持 


    • 已经包含在Nios II开发套件中 



     




     



    4.3.2Nios II处理器管脚分配表 



    Nios II处理器管脚分配表见附录3,具体分配如图4.9所示。 








       



      



      



      



      



      



      



      



      



    4.9  CPU配置图 

    3楼 回复本楼

    引用 强强 2007/9/14 11:51:53 发表于3楼的内容

  • 强强

    强强   |   当前状态:离线

    总积分:4136  2025年可用积分:0

    注册时间: 2007-08-18

    最后登录时间: 2008-03-03

    空间 发短消息加为好友

    强强   发表于 2007/9/14 11:52:31

    第五章  软件的设计与实现 



    5.1 软件设计流程图 



    软件设计流程图如图5.1和图5.2所示。 





       



      



      



      



      



      



      



      



      



      



    5.1 主程序流程图 




     




     


     


     


     


     


     


     


     


     


     


     


     


    5.2 子程序流程图 




    5.2 软件数据结构 



        本程序设计中采用的软件数据结构如下: 



    // Timer Registers 



    typedef volatile struct 



       



        int np_timerstatus;  // read only, 2 bits (any write to clear TO) 



        int np_timercontrol; // write/readable, 4 bits 



        int np_timerperiodl; // write/readable, 16 bits 



        int np_timerperiodh; // write/readable, 16 bits 



        int np_timersnapl;   // read only, 16 bits 



        int np_timersnaph;   // read only, 16 bits 



        } np_timer; 




    // Timer Register Bits 



    enum 



       



        np_timerstatus_run_bit    = 1, // timer is running 



        np_timerstatus_to_bit     = 0, // timer has timed out 




        np_timercontrol_stop_bit  = 3, // stop the timer 



        np_timercontrol_start_bit = 2, // start the timer 



        np_timercontrol_cont_bit  = 1, // continous mode 



        np_timercontrol_ito_bit   = 0, // enable time out interrupt 




        np_timerstatus_run_mask    = (1<<1), // timer is running 



        np_timerstatus_to_mask     = (1<<0), // timer has timed out 




        np_timercontrol_stop_mask  = (1<<3), // stop the timer 



        np_timercontrol_start_mask = (1<<2), // start the timer 



        np_timercontrol_cont_mask  = (1<<1), // continous mode 



        np_timercontrol_ito_mask   = (1<<0)  // enable time out interrupt 



        }; 



    // PIO Registers 



    typedef volatile struct 



       



        int np_piodata;          // read/write, up to 32 bits 



        int np_piodirection;     // write/readable, up to 32 bits, 1->output bit 



        int np_piointerruptmask; // write/readable, up to 32 bits, 1->enable interrupt 



        int np_pioedgecapture;   // read, up to 32 bits, cleared by any write 



        } np_pio; 




     

    4楼 回复本楼

    引用 强强 2007/9/14 11:52:31 发表于4楼的内容

  • 强强

    强强   |   当前状态:离线

    总积分:4136  2025年可用积分:0

    注册时间: 2007-08-18

    最后登录时间: 2008-03-03

    空间 发短消息加为好友

    强强   发表于 2007/9/14 11:53:42

    第六章   开发环境

     

     

      

     6.1硬件开发环境SOPC Builder

    SOPC Builder工具是一个革命性的系统级开发工具,它使得集成组件时花费的时间最少。SOPC Builder可以快速的开发定制的方案,重建已经存在的方案,并为其添加新的功能,提高系统的性能。通过自动集成系统组件,SOPC Builder允许用户将工作的重点集中到系统级的需求上,而不是把一系列的组件装配在一起这种普通的、手工的工作上面。所有版本的Altera Quartus Ⅱ的设计软件都已经包含了SOPC BuilderSOPC Builder提供了一个强大的平台,用于组建一个在模块级和组件级定义的系统。

    SOPC Builder的组件库包含了从简单的固定逻辑的功能块到复杂的、参数化的、可以动态生成的子系统等一些列的组件。这些组件可以是从Altera或其他第三方合作伙伴购买来的IP核,它们其中一些是可以免费下载用作评估的。用户还可简单地创建他们自己的定制的SOPC Builer组件。SOPC Builder库中已有的组件包括了:

    处理器   

      片内处理器 

      片外处理器的接口

    ●IP外设

      存储器接口

      通用的微-外设

      通讯外设

      桥接口

      数字信号处理(DSPIP

      硬件加速外设

    6.1 显示了直观的SOPC Builder的用户界面。

     

     

     

     

     

     

     


    6.1  SOPC Builder用户界面

    用户在Quartus Ⅱ设计软件中打开SOPC BuilderSOPC Builder可以生成应用于Altera各种可编程器件系列的系统。

    优点

    SOPC Builder系统设计在利用可编程器件(PLD)的逻辑资源、存储器、DSP块、专用I/O上,具备以下优势:

    • 在逻辑容量,存储器和DSP块,以及专用I/O标准上的灵活性

    • 快速的上市周期

    • 没有非重复性工程(NRE)费用

    • 不需要制作或昂贵的设计工具

    • 低风险——用户可以以实际的运行频率在硅片上验证他们的设计

    实用性

    自从2000年推出开始,SOPC Builder现已集成到Quartus Ⅱ 软件之中,并做为Altera独一无二的技术提供给所有Altera的客户。SOPC Builder组件,做为 SOPC Builder配套的IP,现已包括在开发套件中,并包含了所有组件库的完全的许可,还有一个开发板、参考设计和其他一些开发工具。工程师还可以从IP MegaStore™页面上下载AlteraAltera第三方合作伙伴提供的用于SOPC BuilderIP核,它们是具有OpenCore OpenCore Plus功能的评估版本的IP核。 Nios开发包也包括了完全的NiosⅡ处理器、一个标准外设库、完整的软件开发工具包和一块包含Altera FPGA器件的开发板。

     

    6.2软件开发环境Quartus

    QuartusⅡ软件提供最全面的FPGACPLD结构化ASIC设计流程。结合多种可直接进行设计应用的知识产权(IP)内核,使设计具有较好的性能和效率。QuartusⅡ软件操作方便,使您能够将产品迅速推向市场。Quartus Ⅱ 软件5.0为高密度FPGA设计提供了最高效和最快速的实现途径,与传统高密度FPGA设计流程相比,其设计效率显著提高。可以充分利用以下高效增强特性:

    编译增强特性FPGA业界首次实现了将迭代时间缩短近70%,支持SignalTap®嵌入式逻辑分析仪等系统内验证工具。

    SOPC Builder快速自动构建系统。

    快速时序估算功能在几分钟内即可生成高密度设计时序估算。

    按键式物理综合技术和自动的设计空间管理器简化了设计优化过程。

    大量的工具间交叉探测功能有助于发现并纠正设计问题。

    新的引脚规划器简化了I/O引脚分配规划、分配和确认过程。

    完整的命令行和工具命令语言(Tcl)脚本界面为您提供高级脚本能力。

    技术领先优势

    Quartus Ⅱ软件在以下领域延续了其技术领先优势:

    性能

    设计流程方法

    编译增强特性

    结构化ASIC设计流程:采用相同的低成本软件和IP,面向FPGA以及结构化ASIC

    完整的命令行和Tcl脚本界面

    支持主流第三方EDA工具

    ●IP集成技术

    SOPC Builder集成和系统生成工具

    Nios嵌入式处理器

    大量现成的IP内核库

    DSP Builder软件

    布局布线技术

    时序逼近技术

    验证解决方案

    先进的多时钟时序分析能力 PowerPlay功耗分析 无需重新配置器件,即可在系统实现存储器和常量升级芯片编辑器SignalTap 嵌入式逻辑分析仪集成了所有主流第三方EDA验证工具和方法

    6.3调试工具SDK

        SOPC Builder为每个新创建的Nios CPU 生成一个定制软件开发包(SDK)。SDK为用户提供软件开发的基础,SDK由下面几部分组成:

    C语言头文件,包括每个外设在存储器中的地址映像和相应数据结构

    与外设相关的子程序被编译后生成的编译库

    用于重新编译库的Makefile文件

    示例源程序和Makefile文件

        SDK中可方便地对程序进行在线调试。

     

     

     

     

     

     

     

     

     

     

     

    5楼 回复本楼

    引用 强强 2007/9/14 11:53:42 发表于5楼的内容

  • 强强

    强强   |   当前状态:离线

    总积分:4136  2025年可用积分:0

    注册时间: 2007-08-18

    最后登录时间: 2008-03-03

    空间 发短消息加为好友

    强强   发表于 2007/9/14 11:55:15

    第七章  系统测试 



    测试主要依据是本系统的技术指标,是对系统整体功能和性能的综合测试与评估。测试原理是系统测试活动的理论基础,测试方法是测试原理的实际应用和获得测试数据的手段. 



    7.1硬件测试 



        先进行仿真测试,在进行实际测试。 



    7.1.1硬件仿真测试 



    Quartus Ⅱ中连接好引脚后进行适配编译,系统会自动对连线进行检查 









     


     


     


     


     


     


     


     


     


     


     


    7.1 引脚图 



    若图7.1中引脚分配不对在Quartus Ⅱ中会给出提示,根据提示可进行相关检查。 



    7.1.2实际测试 



         在仿真测试无误后,下载到EP1C3T144C8中,对实际PCB板进行测试。在这一步中主要是根据原理图使用万用表、示波器进行有关测量。 




    7.2软件测试 



    基于软件的共性,对于软件的测试遵循一般软件的测试原理和方法。同时,针对本软件的特性,找到合适的测试方法。主要是从功能方面结合硬件在SDK中进行了在线测试。 




    7.3总体测试 



    软、硬件测试后,要进行综合测试,用来检验系统的整体功能。具体步骤如下: 



    (1)      将中心温度改为26.5。先按一次SET键,数码显示小数点闪动,连 



    按五次‘+’键,小数位变为5。按一次‘OK’键,小数位不闪动,整数位闪动,按一次‘+’键,整数位变为26,按‘OK’键确定。小数整数位都不闪动后按一次‘SET’键,进入控温精度设置,连按一定次数‘SET’键进入希望的其他设置或退出设置。 



    (2)      将控温精度改为1.6。先按二次‘SET’键,数码管显示小数位闪动, 



    连按四次‘-’键成6闪动,按‘OK’键确定。小数位不闪动,整数位闪动。按二次‘-’键,整数位变为1,按‘OK’键确定,小数整数位都不闪动后按一次‘SET’键,进入洒水时间设置,连按一定次数‘SET’键进入希望的其他设置或退出设置。 



    (3)      同理将洒水时间设置为130秒,将洒水时间间隔设置为1256分。 



    (4)      将时间设置为1200 



    (5)      退出设置。 



    (6)      一分钟后LED显示温度为25.00度。 



    (7)      用温度计测当时室温,为25.00度。 



    经过几百组数据的反复测试,系统完全达到了设计性能指标的要求。 

















    第八章       




    基于NIOSⅡ的自动温控系统能广泛地应用于工、农业及人们的居家生活中。由于本系统采用SOPC开发,可以很方便地根据用户的要求实现不同的专用的自动温控系统。具有广阔的市场前景。 



    本系统经过了设计阶段、开发实现阶段以及最后的应用测试阶段。经过开发团队3个月的努力,核心问题已经全部解决,所有功能均已实现,只是在易用性上还有待提高。 



    这次研发的经历使我们对嵌入式的原理及应用有了深刻的了解,真正做到了学有所得、学有所用,可以说获益匪浅。 



    整个系统的开发过程是曲折的,首先在硬件设计上,由于有以前所学课程的基础,通过查阅资料,设计出了硬件原理图。经过测试与修改,最终完善了硬件电路的设计。对于软件设计,硬件编程语言和普通的编程设计还有一定的差异,所以仅有以前的编程知识是不够的,我们在这方面花费了很多的精力和时间。尽管过程很艰难,但是在真正意义上学到了知识,为以后的工作和学习积累了宝贵的经验。 

























    附录1    部分源程序代码 



    #include "excalibur.h" 



    int hex2sev(int hex) 






        int led[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; 



        return(led[hex/10]<<8)+led[hex%10]; 






    int main(void) 



    {  



        int zhongxin="25",jingdu=3,sashui=30,jiange=6,dian=0,du=0,s=0,g=0,hour=0,minute=0,second=0; 



        na_timer_0->np_timercontrol=6; 



        while(1) 



       



           if(na_timer_0->np_timerstatus & 1 ) 



          



               if(++second==60) 



              



                  second=0; 



                  if(++minute==60) 



                 



                      minute=0; 



                      if(++hour==24) 



                     



                         hour=0; 



       



                       



                 



              



        na_led_1->np_piodata=hex2sev(hour)-0x80; 



        na_led_2->np_piodata=hex2sev(minute); 



        nr_delay(500); 



        na_led_1->np_piodata=hex2sev(hour); 




        if((na_key->np_piodata)&& 8==0 ) 



              



                  na_led_1->np_piodata=hex2sev(zhongxin); 



                  na_led_2->np_piodata=hex2sev(0x30); 



                  while(na_key->np_piodata && 4==0) 



                     



                       dian=dian+1; 



                      if(dian>=10){dian=0;zhongxin=zhongxin+1;} 



                       na_led_1->np_piodata=hex2sev(zhongxin); 



                       na_led_2->np_piodata=hex2sev(dian); 



                     



                  while(na_key->np_piodata && 2==0) 



                     



                       dian=dian-1; 



                      if(dian<0){dian=9;;zhongxin=zhongxin-1;} 



                       na_led_1->np_piodata=hex2sev(zhongxin); 



                       na_led_2->np_piodata=hex2sev(dian); 



                     



                  if(na_key->np_piodata && 1==0) 



                 



                     zhongxin=zhongxin+1; 



                     if(zhongxin>=100)zhongxin=99; 



                     na_led_1->np_piodata=hex2sev(zhongxin); 



                     na_led_2->np_piodata=hex2sev(dian); 



                   



                  if(na_key->np_piodata && 1==0)break; 



                  if(na_key->np_piodata && 8==0) 



                 



                      na_led_1->np_piodata=hex2sev(jingdu); 



                      na_led_2->np_piodata=hex2sev(0x30); 



                  while(na_key->np_piodata && 4==0) 



                     



                       du=du+1; 



                       if(du>=10){du=0;jingdu=jingdu+1;} 



                       na_led_1->np_piodata=hex2sev(jingdu); 



                       na_led_2->np_piodata=hex2sev(du); 



                     



                  while(na_key->np_piodata & 2==0) 



                     



                       du=du-1; 



                       if(du<0){du=9;jingdu=jingdu-1;} 



                       na_led_1->np_piodata=hex2sev(jingdu); 



                       na_led_2->np_piodata=hex2sev(du); 



                     



                  if(na_key->np_piodata && 1==0) 



                 



                     jingdu=jingdu+1; 



                     if(jingdu>=10)jingdu=10; 



                     na_led_1->np_piodata=hex2sev(jingdu); 



                     na_led_2->np_piodata=hex2sev(du); 



                   



                  if(na_key->np_piodata && 1==0)break; 



                  if(na_key->np_piodata & 8==0) 



                 



                      na_led_1->np_piodata=hex2sev(sashui); 



                      na_led_2->np_piodata=hex2sev(0x30); 



                  while(na_key->np_piodata & 4==0) 



                     



                       s=s+1; 



                       if(s>=10){s=0;sashui=sashui+1;} 



                       na_led_1->np_piodata=hex2sev(sashui); 



                       na_led_2->np_piodata=hex2sev(s); 



                     



                  while(na_key->np_piodata & 2==0) 



                     



                       s=s-1; 



                       if(s<0){s=9;sashui=sashui-1;} 



                       na_led_1->np_piodata=hex2sev(sashui); 



                       na_led_2->np_piodata=hex2sev(s); 



                     



                  if(na_key->np_piodata && 1==0) 



                 



                     sashui=sashui+1; 



                     if(sashui>=90)sashui=90; 



                     na_led_1->np_piodata=hex2sev(sashui); 



                     na_led_2->np_piodata=hex2sev(s); 



                   



                  if(na_key->np_piodata && 1==0)break; 



                  if(na_key->np_piodata & 8==0) 



                 



                      na_led_1->np_piodata=hex2sev(jiange); 



                      na_led_2->np_piodata=hex2sev(0x30); 



                  while(na_key->np_piodata & 4==0) 



                     



                       g=g+1; 



                       if(g>=10){g=0;jiange=jiange+1;} 



                       na_led_1->np_piodata=hex2sev(jiange); 



                       na_led_2->np_piodata=hex2sev(g); 



                     



                   while(na_key->np_piodata & 2==0) 



                     



                       g=g-1; 



                       if(g<0){g=9;jiange=jiange-1;} 



                       na_led_1->np_piodata=hex2sev(jiange); 



                       na_led_2->np_piodata=hex2sev(g); 



                     



                  if(na_key->np_piodata && 1==0) 



                 



                     jiange=jiange+1; 



                     if(jiange>=100)jiange=99; 



                     na_led_1->np_piodata=hex2sev(jiange); 



                     na_led_2->np_piodata=hex2sev(g); 



                   



                  if(na_key->np_piodata && 1==0)break; 



                  if(na_key->np_piodata & 8==0) 



                 



                      while(na_key->np_piodata & 4==0) 



                     



                       hour=hour+1; 



                       if(hour>=24){hour=0;} 



                     



                  while(na_key->np_piodata & 2==0) 



                     



                       hour=hour-1; 



                       if(hour<0){hour=0;} 



                     



                   if(na_key->np_piodata & 1==0) 



                   



                    while(na_key->np_piodata & 4==0) 



                     



                      minute=minute+1; 



                       if(minute>=60){minute=0;} 



                     



                  while(na_key->np_piodata & 2==0) 



                     



                       minute=minute-1; 



                       if(minute<0){minute=0;} 



                     



                  na_led_1->np_piodata=hex2sev(hour); 



                  na_led_2->np_piodata=hex2sev(minute); 



              



                    if(na_key->np_piodata & 1==0)break; 



                   if(na_key->np_piodata & 8==0)break; 



                 



               



           



        



     



      na_timer_0->np_timerstatus=0; 

    6楼 回复本楼

    引用 强强 2007/9/14 11:55:15 发表于6楼的内容

  • zgx123

    zgx123   |   当前状态:在线

    总积分:52  2025年可用积分:0

    注册时间: 2011-04-06

    最后登录时间: 2011-04-06

    空间 发短消息加为好友

    zgx123   发表于 2011/4/6 12:31:44

     楼主

    可以发你的这个系统的全部资料过来给我吗?

    谢谢啊

    zgx123_good@163.com

    7楼 回复本楼

    引用 zgx123 2011/4/6 12:31:44 发表于7楼的内容

总共 , 当前 /