李亚峻,徐世超,黄建民,王 洁,马 强
(天津科技大学电子信息与自动化学院,天津 300222)
数字电压表的VHDL程序设计与硬件实现
李亚峻,徐世超,黄建民,王 洁,马 强
(天津科技大学电子信息与自动化学院,天津 300222)
将FPGA与模数转换器TLV571相结合设计了数字电压表.用VHDL语言编程实现了模拟电压的测量、模数转换、计算与读取,用状态机完成了FPGA对TLV571的控制.将数字电压、模拟电压的BCD码与ROM地址、数据一一对应,用查找表的方式从相应的ROM地址中取出高4位和低4位BCD码,对二者进行BCD码加法运算即可获得模拟电压值.通过实验平台测试验证了数字电压表设计的正确性.
现场可编程门阵列;VHDL语言;模数转换;BCD码
目前的数字电压表主要以单片机[1–2]和现场可编程门阵列(FPGA)[3–4]作为系统的控制核心.基于单片机设计的优点是技术成熟、设计成本较低、编程灵活.但是,单片机系统的外围电路由许多独立元件连接而成,所以系统的复杂度高、抗干扰能力差、可靠性较低、功耗高.基于FPGA设计的优点是测量精度高、速度快、读数方便、抗干扰能力强、可扩展性强.另外,FPGA由可编程门阵列和可编程逻辑器件二者演变而来,它既有前者的高集成度和通用性,又有后者的用户可编程性[4].FPGA控制器的硬件功能完全由软件编程实现,调试方便,不需改变硬件电路即可实现系统更新,克服了基于单片机设计系统的缺点[5].
文献[4]采用了基于FPGA的设计方法,但是在其VHDL程序设计中存在明显不足:该程序用多个if嵌套语句编程实现,随着数据的有效位数增加,编程复杂度将增加,使程序的可读性变差;而且,此方法对高4位和低4位BCD码相加后进行BCD码调整,只考虑了求和后每一位十六进制数大于9且小于等于15的情况,没有考虑大于15、小于等于18的情况.
本文基于FPGA器件、用VHDL语言编程实现数字电压表的设计,介绍数字电压、模拟电压BCD码与存储器(ROM)地址、数据的关系,详细阐述了BCD码加法运算的原理.
1.1 数字电压表的VHDL模块化设计
图1中虚线框内为采用VHDL语言编程实现的FPGA控制器adc_volmeter3V3.设计中采用了模块化设计思想,每个模块实现某种特定功能.时钟分频模块clkdiv为其他模块提供时钟信号,模数转换控制器ad_ctrl控制外部的并行模数转换器TLV571正常工作,ROM adcrom的地址和存储数据分别对应于数字电压和模拟电压值的BCD码,BCD码运算控制器conv_bcd实现BCD码的加法运算,数码管显示控制模块seg7实现被测电压在4个数码管上的动态显示.
图1中各模块输入输出端口连线上的标识符表明该连线为FPGA控制器的内部信号线,用于各模块之间的连接,如clkdiv模块为seg7模块提供时钟信号clk_seg7,ad_ctrl模块输出的数字电压d_adc为adcrom模块提供存储模拟电压值的地址addr.
1.2 FPGA器件与外设的连接
图1中也显示了FPGA器件与外设的连接关系.各模块输入输出端口连线左右两侧的标识符表示FPGA器件相应引脚将与实验平台上的外设进行硬件连接.图1右上角为FPGA器件与TLV571的连接关系,tube_n和dp_gtoa分别接数码管的位选和段选端,clk_100,M接100MHz的外部晶振,rst接按钮用于复位.
clkdiv模块和seg7模块有大量的VHDL源程序可供参考,这里不作介绍.下面重点介绍TLV571的工作原理与实现、数字电压和模拟电压值与ROM地址和数据的对应关系、BCD码的加法运算.
2.1 TLV571的工作时序
TLV571是8位并行AD转换器,每次转换需要16个时钟周期.为了使其正常工作,需要先配置内部的控制寄存器CR0、CR1.该芯片共有24个引脚,其中,A1/D7、A0/D6、D5~D0为数据输入/输出端,用于输入对CR0(A1A0=00时)和CR1(A1A0=01时)的配置信息、输出AD转换后的8位数字电压;片选、写、读、转换完成标志均低电平有效;待测电压由AIN端输入.
CR0、CR1配置不同则AD转换器的工作时序有所不同[6].在本设计中CR0寄存器被配置为00,101,000(16进制数为28,H),CR1寄存器被配置为01,000,000(16进制数为40,H),即选择由外部时钟控制、用软件方式启动、当变为低电平时表示AD转换已完成、输出8位二进制数,其工作时序如图2所示.
图2 TLV571工作时序图(软件启动)Fig. 2 Timing chart of TLV571(software start)
2.2 TLV571的FPGA控制
图1中的ad_ctrl模块是TLV571的控制模块,其VHDL语言编程采用了状态机的方式.如图3所示,共有8个状态s0—s7,每个状态下的片选信号nCS、写信号nWR、读信号nRD和AD转换完成标志nINT严格按照图2的工作时序进行设置.
图3 TLV571状态转换图Fig. 3 Diagram of TLV571 state transition
已知FPGA实验平台上的TLV571参考电压为3.3V,因此数字电压表的可测量范围为0~3.3V.TLV571为8位并行输出,可知其电压最小分辨率为3.3V/256≈0.013V,即AD输出数字电压d_adc为00,000,001时所对应的模拟电压值为0.013V,据此可求出任意8位数字电压所对应的模拟电压值.
为了简化运算,事先将数字电压的高4位和低4位所对应的模拟电压值存储在ROM中,如表1第2、4、6、8列所示,其中第2列d_adch和第6列d_adcl分别为d_adc的高4位和低4位.根据AD输出的实际数字电压,查表1后将d_adch和d_adcl所对应的模拟电压值相加即可得到待测模拟电压值.例如当d_adc为10,111,111时,其高4位1,011和低4位1,111对应的模拟电压值分别为2.288V和0.195V,所以可得待测模拟电压值为2.288+0.195=2.483V.
存储器只能存储二进制数,所以实际存储在ROM中的数据是模拟电压值的BCD码,即用十六进制表示的十进制数.ROM中存储的数据与模拟电压值对应,ROM地址与AD输出的数字电压d_adc对应.由表1可知,每个模拟电压值所对应的BCD码由4位十六进制数组成,ROM中的每个存储单元可存放2位十六进制数,所以每个BCD码占用2个存储单元,32个BCD码共占用64个存储单元.由此可令ROM的低端地址00,H~1F,H存储电压值对应的高4位BCD码d_bcdh,ROM的高端地址20,H~3F,H存储电压值对应的低4位BCD码d_bcdl.而ROM地址与d_adch和d_adcl的对应关系为:用d_adch乘以2作为ROM地址addr_h1,用d_adcl乘以2再加上偏移量20,H作为ROM地址addr_l1.
计算ROM地址的VHDL程序如下:
表1 数字电压、模拟电压与ROM地址、ROM数据的对应关系Tab. 1 Correspondence among digital voltage,analog voltage,ROM address and ROM data
2个十进制数相加逢十进一,2个十六进制数相加逢十六进一,为了使2个与电压值对应的BCD码在进行加法运算时能够逢十进一,需要对运算规则进行调整:设1个16位的中间变量tmp用于存储调整值,设最低位的进位位co=0.按照从低位到高位的顺序,将2个BCD码相同位之和与co相加.当结果大于1,001(9)时,tmp与之相同位赋值0,110(6),并使相邻高位的co=1;当结果小于等于1,001(9)时,tmp与之相同位赋值0,000,并使相邻高位的co=0.循环4次后将2个BCD码之和与tmp按二进制数相加,所得结果的十六进制数表示即为2个BCD码之和.VHDL程序段如下:
——大于9时需加6,且向高位有进位
以模拟电压2.483V为例,经由AD转换后得到数字电压d_adc为10,111,111,查表1可知,高4位1,011对应的ROM地址addr_h1为16,H、addr_h2为17,H,其中存放的数据d_bcdh为2,288,H;低4位1,111对应的ROM地址addr_l1为3E,H、addr_l2为3F,H,其中存放的数据d_bcdl为0,195,H.对这2个BCD码进行加法运算,最终得到BCD码2,483,H与模拟电压值完全一致,只是在最高位后面缺小数点,这个问题只需在数码管显示控制模块seg7中不仅点亮相应数字的段,而且点亮最高位数码管的点即可解决.
数字电压表的硬件测试在合众达SEED-XDTK FPGA教学实验平台上进行,所用FPGA器件为Xilinx公司的XC4VSX25.在Xilinx集成开发环境ISE10.1中对工程进行综合、实现、产生可编程文件后下载(配置目标器件)到实验平台上.用万用表(倍思特数字万用表DT–9205,20V档,精确到小数点后2位)和本设计实现的数字电压表(精确到小数点后3位)检测并显示实验平台上6个测试点的电压值,结果见表2.测量的相对误差小于3%.
VHDL Programming and Hardware Realization of the Digital Voltmeter
LI Yajun,XU Shichao,HUANG Jianmin,WANG Jie,MA Qiang
(College of Electronic Information and Automation,Tianjin University of Science & Technology,Tianjin 300222,China)
Combining FPGA with ADC TLV571,a digital voltmeter was designed. The analog voltage measurement,analog-digital conversion,computing and reading were realized with VHDL language. TLV571,was controlled by FPGA with a state machine. The digital voltage and BCD codes of analog voltage are in one-to-one correspondence with the ROM address and data. Using the look-up tables,the highest four bit BCD codes and the lowest four bit BCD codes can be read from corresponding ROM addresses and then the analog voltage can be computed through the addition operation of the two BCD codes. Experiments with experimental platform confirmed the validity of the digital voltmeter’s design.
FPGA;VHDL;ADC;BCD code
TP332.1
A
1672-6510(2014)01-0065-04
10.13364/j.issn.1672-6510.2014.01.013
2013–08–21;
2013–11–04
天津市教育科学“十二五”规划课题(HEYP6021);天津科技大学实验室开放基金资助项目(1202A301)
李亚峻(1973—),女,内蒙古包头人,讲师,lyj_2872@sohu.com.