传统的数字电压表规划一般以大规模ASIC(专用集成电路)为中心器材,并辅以少数中规模集成电路及显现器材构成。这种电压表的规划简略、精确度高,可是由于选用了ASIC器材使得它短缺灵活性,其体系功用固定,难以更新扩展。而运用FPGA规划的电压表,选用FPGA芯片操控通用A/D转化器,可使速度、灵活性大大优于通用数字电压表。、
本文选用STEP-MAX10M08中心板和STEP Base Board V3.0底板来完结简易电压表规划,咱们将规划拆分红三个功用模块完结:
ADC081S101_driver: 驱动SPI接口ADC芯片完结模仿电压信号收集。
bin_to_bcd:将二进制数据转化成BCD码的办法。
Segment_led:通过驱动独立式数码管将电压数据显现出来。
Top-Down层次规划
模块结构规划
1. ADC介绍
模数转化器即A/D转化器,或简称ADC,一般是指一个将模仿信号转变为数字信号的电子元件。一般的模数转化器是将一个输入电压信号转化为一个输出的数字信号。由于数字信号自身不具有实际意义,只是表明一个相对巨细。故任何一个模数转化器都需求一个参阅模仿量作为转化的规范,比较常见的参阅规范为最大的可转化信号巨细。而输出的数字量则表明输入信号相对于参阅信号的巨细。
模仿体系与数字体系结合模型
并行ADC和串行ADC模型
上图两个都是8位ADC模型,分辩率为 2的8次方等于256,行将Vref分红256份,能够分辩的模仿步进为Vref / 256,量化数据N = 256 * Vin / Vref 。
并行ADC与数字电路接口包括一根clk和8根data管脚,clk为芯片时钟管脚,data为芯片数据管脚,每个clk周期从data管脚收集8bit的数据,完结一次模数转化,所以clk频率等于采样率。
串行ADC(以ADC081S101为例)与数字电路接口为三根线(cs,clk,din),兼容三线SPI总线,cs为芯片使能管脚,clk为芯片时钟管脚,din为芯片数据管脚,当ADC芯片使能时每个clk周期从din收集1bit的数据,可是依据ADC081S101的时序,需求16个clk完结一次采样,所以clk频率至少等于采样率的16倍。
2. ADC模块电路衔接
本规划所选用的STEP Base Board V3.0底板上的ADC模块电路,其电路图如下:
ADC模块电路
FPGA直接衔接ADC081S101芯片的操控端,ADC有6个管脚,3脚Vin为VCC和Vref功用复用,即Vin = VCC = Vref。ADC前端是运放电路LMV721,运放模块为电压跟从电路,再往前端是一个跳冒排针,用来挑选ADC采样信号的来历,当短路帽将1、2脚短路时,ADC收集电位计电压,当短路帽将2、3脚短路时,ADC采射频端子或P4排针信号。本规划咱们是收集旋转编码器的电压,所以需求用短路帽将1、2脚短路。
3. ADC模块驱动规划
ADC081S101串行通讯时序如下图:
注:
1. SCLK空闲时为高电平,CPOL = 1,上升沿(第二个边缘)采样,CPHA = 1,假如例化通用SPI核完结规划,需求选用SPI的第四种作业形式。
2. CS信号拉低有用,通过16个时钟完结一次ADC转化并采样,采样回来的数据前3位无效,接下来为DB7~DB0(有用数据),再接下来为无效数据。
针对ADC081S101时序,咱们用Verilog规划一个计数器,当计数器值不一起完结不同操作,完结一次ADC采样,程序完结如下:
到这咱们就完结了串行ADC芯片ADC081S101的驱动规划,整个采样周期用了35个体系时钟,假如咱们选用12MHz时钟作为该模块体系时钟,采样率Fs = 12M/35 = 343Ksps,ADC主频Fsclk = 12 MHz /2 = 6MHz。
ADC081S101主频及采样率要求如下,依照要求咱们当时的主频和采样率缺乏,所以在运用该模块时,能够运用更高的时钟(比方24MHz)以到达芯片的要求
注:时钟频率Fsclk,最小值为10MHz,最大值为20MHz,采样率在500Ksps~1Msps
模块接口如下:clk和rst_n为体系时钟及复位,adc_cs,adc_clk和adc_dat为ADC操控管脚,adc_data为ADC采样数据,adc_done发生一个脉冲对应adc_data得到一个有用数据
4. 时钟获取
由于需求更高的时钟供ADC模块运用,咱们例化pll核得到24MHz时钟,一起例化pll模块和ADC081S101_driver模块,并将pll的输出与ADC081S101_driver模块的clk连线。
Pll模块和ADC081S101_driver模块的衔接程序完结如下:
5. 采样成果显现
假定ADC模仿输入电压为3.3V,理论上咱们得到的采样数据adc_data应该为8’hff,而电压表终究显现在数码管上的数据应该为3.3,咱们如何将8’hff转化成能够显现的3.3数据呢?这就规划到ADC量化数据的逆向运算了。
咱们知道量化运算 N = 256 * Vin / Vref,
那么逆向运算为Vin = N * Vref / 256,其间Vref = 3.3V,所以Vin = N * 0.0129
所以咱们需求用FPGA核算adc_data * 0.0129的成果,然后为了运用十进制的显现,先将成果进行BCD转码,然后显现在数码管上。
将ADC采样数据按规矩转化为电压数据(乘以0.0129),这儿咱们直接乘以129,得到的数据通过BCD转码后小数点左移4位即可,程序完结如下:
二进制转BCD码程序完结如下:
最终得到20位的数据输出,每4位表明一个BCD码,所以有5位有用数据,这儿咱们还需求将小数点左移4位,核算出来的数应该是X.XXXX伏特,1个整数位和4个小数位,中心板上只要两个数码管,取最高的两个BCD码显现到数码管X.X伏特,个位小数点点亮,分位小数点平息,程序完结如下:
归纳后的规划框图如下:
RTL规划框图
到这一步就完结了根据FPGA的简易电压表规划。将程序下载到FPGA中,STEP Base Board V3.0底板上P3接口的1、2脚短路,旋转底板右上角的电位计,调查中心板数码管改变,也可一起用万用表丈量P3短路处的电压,与数码管上的成果比照。
实物图: