湖南科技学院课程设计任务书课题名称数字电压表设计系别电子工程系专业电子科学与技术班级电科1001班学号201006003118姓名安启祥指导老师梁晓琳2012年12月9日基于FPGA数字电压表的设计一、前言EDA是电子设计自动化(ElectronicDesignAutomation)的缩写,在20世纪60年代中期从计算机辅助设计(CAD)、计算机辅助制造(CAM)、计算机辅助测试(CAT)和计算机辅助工程(CAE)的概念发展而来的。EDA技术就是以计算机为工具,设计者在EDA软件平台上,用硬件描述语言VHDL完成设计文件,然后由计算机自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。本电压表的电路设计正是用VHDL语言完成的。此次设计采用的是Altera公司的QuartusII7.0软件。本次设计的参考电压为2.5V,精度为0.01V。,设计周期短,开发效率高。二、设计要求设计一个数字电压表,利用8位A/D转换器,将连续的模拟电信号转换成离散的数字电信号,并加以显示,要求其量程为0-2.5V,分辨率约为0.01V,三位数码管显示。其中一位为整数,两位为小数能正确显示小数点。三、整体设计1.数字电压表的基本原理数字电压表整体设计框图,如下图所示,数字电压表系统由A/D(TLC549)转换模块、FPGA控制模块、数码显示模块三部分构成。FPGA控制模块控制外部A/D转换器自动采样模拟信号,通过A/D芯片转换为数字信号,再由FPGA控制模块控制数码管动态扫描向外部数码管显示电路输出数据。A/D转换器负责采集模拟电压,转换成8位数字信号送入FPGA转换控制模块,FPGA转换控制模块负责A/D转换的启动、地址锁存、输入通道选择、数据读取、转换等工作,数码显示模块负责显示当前的电压值。2.A/D(TLC549)转换模块TLC549是TI公司生产的一种低价位、高性能的8位A/D转换器,它以8位开关电容逐次逼近的方法实现A/D转换,其转换速度小于TLC549FPGA数码显示控制控制17us,最大转换速率为40000HZ,4MHZ典型内部系统时钟,电源为3V至6V。它能方便地采用三线串行接口方式与各种微处理器连接,构成各种廉价的测控应用系统。TLC549各引脚功能REF+:正基准电压输入2.5V≤REF+≤Vcc+0.1。REF-:负基准电压输入端,-0.1V≤REF-≤2.5V。且要求:(REF+)-(REF-)≥1V。VCC:系统电源3V≤Vcc≤6V。GND:接地端。/CS:芯片选择输入端,要求输入高电平VIN≥2V,输入低电平VIN≤0.8V。DATAOUT:转换结果数据串行输出端,与TTL电平兼容,输出时高位在前,低位在后。ANALOGIN:模拟信号输入端,0≤ANALOGIN≤Vcc,当ANALOGIN≥REF+电压时,转换结果为全“1”(0FFH),ANALOGIN≤REF-电压时,转换结果为全“0”(00H)。I/OCLOCK:外接输入/输出时钟输入端,同于同步芯片的输入输出操作,无需与芯片内部系统时钟同步。四、模块设计1、部分设计程序TLC549模块:moduleTLC549(clk,reset,sdata,cs,dataout,clk_ad);inputclk;inputreset,sdata;output[7:0]dataout;outputclk_ad,cs;reg[7:0]dataout,dataout_r;regcs;regclk_ad_r,clk_r;reg[7:0]count;reg[2:0]temp;reg[3:0]cnt;regmark;regflag;parameter[2:0]s0=0,s1=1,s2=2;reg[2:0]c_st;//内部逻辑功能描述always@(posedgeclk)//分频电路beginif(count119)count=count+1;elsebegincount=0;clk_r=~clk_r;endendalways@(posedgeclk)//时钟信号beginclk_ad_r=~clk_r;endalways@(posedgeclk_rornegedgereset)//状态机beginif(!reset)c_st=s0;elsecase(c_st)s0:begincs=1;mark=0;if(temp==3)begintemp=0;c_st=s1;endelsebegintemp=temp+1;c_st=s0;endends1:begincs=0;mark=1;c_st=s2;ends2:begincs=0;mark=1;if(flag==1)c_st=s0;elsec_st=s2;enddefault:c_st=s0;endcaseendA/D转换模块:modulelookup(V,q);input[7:0]V;output[11:0]q;reg[11:0]q;reg[11:0]HB,LB;wired1,d2,d3;always@(V)begincase(V[7:4])//--A/D值的高4位转换成3位BCD码4'b1111:HB=12'b001001000000;//--2.404'b1110:HB=12'b001000100100;//--2.244'b1101:HB=12'b001000001000;//--2.084'b1100:HB=12'b000110010010;//--1.924'b1011:HB=12'b000101110110;//--1.764'b1010:HB=12'b000101100000;//--1.604'b1001:HB=12'b000101000100;//--1.444'b1000:HB=12'b000100101000;//--1.284'b0111:HB=12'b000100010010;//--1.124'b0110:HB=12'b000010010110;//--0.964'b0101:HB=12'b000010000000;//--0.804'b0100:HB=12'b000001100100;//--0.644'b0011:HB=12'b000001001000;//--0.484'b0010:HB=12'b000000110010;//--0.324'b0001:HB=12'b000000010110;//--0.164'b0000:HB=12'b000000000000;//--0.00default:HB=12'b111111111111;Endcase数码显示模块:modulescan_led(clk_1k,d,dig,seg);//模块名scan_ledinputclk_1k;//输入时钟input[11:0]d;//输入要显示的数据output[7:0]dig;//数码管选择输出引脚output[7:0]seg;//数码管段输出引脚reg[7:0]seg_r;//定义数码管输出寄存器reg[7:0]dig_r;//定义数码管选择输出寄存器reg[3:0]disp_dat;//定义显示数据寄存器reg[2:0]count;//定义计数寄存器assigndig=dig_r;//输出数码管选择assignseg=seg_r;//输出数码管译码结果always@(posedgeclk_1k)//定义上升沿触发进程beginif(count2)count=count+1'b1;elsecount=0;endalways@(posedgeclk_1k)begincase(count)//选择扫描显示数据3'd0:disp_dat=d[11:8];//第一个数码管3'd1:disp_dat=d[7:4];//第二个数码管3'd2:disp_dat=d[3:0];//第三个数码管endcasecase(count)//选择数码管显示位3'd0:dig_r=8'b01111111;//选择第一个数码管显示3'd1:dig_r=8'b10111111;//选择第二个数码管显示3'd2:dig_r=8'b11011111;//选择第三个数码管显示endcasecase(count)3'd0:seg_r[7]=0;3'd1:seg_r[7]=1;3'd2:seg_r[7]=1;endcaseendalways@(disp_dat)begincase(disp_dat)//七段译码4'h0:seg_r[6:0]=7'b1000000;//显示04'h1:seg_r[6:0]=7'b1111001;//显示14'h2:seg_r[6:0]=7'b0100100;//显示24'h3:seg_r[6:0]=7'b0110000;//显示34'h4:seg_r[6:0]=7'b0011001;//显示44'h5:seg_r[6:0]=7'b0010010;//显示54'h6:seg_r[6:0]=7'b0000010;//显示64'h7:seg_r[6:0]=7'b1111000;//显示74'h8:seg_r[6:0]=7'b0000000;//显示84'h9:seg_r[6:0]=7'b0010000;//显示9default:seg_r[6:0]=7'b1111111;endcaseendEndmodule2、仿真波形CLK为TLC549的时钟输入信号,sdata为TLC549的数据输入信号,将其置为高电平,reset为复位信号,也置为高电平。Clk_ad为TLC549的输出时钟信号,cs为TLC549的片选信号,低电平有效;data_out为TLC549的8位数据输出端;c_st为状态机的状态。五、结论1.实验数据数码管显示电压值2.51V1.26V0.33V万用表测得电压值2.447V1.221V0.320V2.总结通过对FPGA芯片进行VHDL语言编程,控制TLC549A/D转换芯片,来实现数字电压表的功能。通过设计表明,VHDL具有很强的电路描述和建模能力.能从多个层次对数字系统进行建模和描述,从而大大简化了硬件设计任务,提高了设计效率和可靠性。这种设计方法必将在未来的数字系统设计中发挥越来越重要的作用。六、心得体会经过这次设计,让我对FPGA人设计流程又有了一个全新的认识。FPGA需要由软件去设计,再由硬件来验证,这种模式正是我们所喜欢的。比如你去设计一个东西,如果只在软件上面仿真成功,而不拿去又硬件验证的话,那学起来兴趣也不大,当你一步一步去调试,使其实际效果与自己的设想完全吻合时,你便会有一种无比的成就感,这也会成为你不断去学习的源泉。