基于ICE40+比较器实现电压表
利用FPGA内部逻辑加上外部高速比较器实现sigma-delta-ADC,将采集的的电压在oled显示器上面显示
标签
FPGA
数字逻辑
显示
2022寒假在家练
zhaolin0912
更新2022-03-02
安徽师范大学
1199

一.项目介绍

    该项目是利用 ICE40UP5K FPGA核心板和扩展版实现数字电压表的功能.实现过程是利用FPGA内部逻辑加上外部高速比较器实现sigma-delta-ADC,将采集的的电压在oled显示器上面显示.

二.硬件介绍

Fpd_dUgeRqRgFp0avJu0yVkMgsKU

   硬件部分分为核心板和扩展版

       扩展版包括:两个按键

                       4个单色LED

                       12个WS2812B RGB三色灯

                       1姿态传感器

                       1个128*64OLED显示器

                       1个蜂鸣器

                       1个可调电位器

                       一路音频信号输入

                       8位R-2R电阻网络构成的DAC

 

        核心板主要包括:

                       ICE40FPGA

                       LPC11U35下载器

                       两个高速比较器

 

三.设计思路

设计流程图

FoNjlSVpdjccH0FJURGBM2zvXb46

第一步实现过程:调用lattice官方sigma-delta-ADC的ip

第三步实现过程:顶层例化时将ADC模块与OLED模块相连接

第四步实现过程:在网上查找实现二进制到BCD转码的相关算法

 

四.实现功能及图片展示

                能够实现0-3.3v的电压采集和显示

       1.最大电压显示

FrdschtsPjqlIgrrxn90Tb18g6VK

       

      2.最小电压显示   

FoP0IGAcMvwjTdHHXQ4j14IZF3BY

      3.中间电压显示

Fpak_qeAJvf5iCtmKMniP8LlGRAT

 

五.主要代码片段及说明

//顶层文件
module top(
clk,
res,
oled_rst,
oled_dcn,
oled_clk,
oled_dat,
i_analog_cmp,
o_analog_out,
sample_rdy,
o_digital_out
);


//输入输出端口
input clk;
input res;
input i_analog_cmp;
output oled_rst;
output oled_dcn;
output oled_clk;
output oled_dat;
output sample_rdy;
output o_analog_out;
output [7:0] o_digital_out;//采集的数据输出连接到oled模块进行显示


//oled模块例化          
OLED12864 u_OLED12864(
	 .clk(clk),		
	 .rst_n(res),		
	 .o_digital_out(o_digital_out),//接受adc采集的数据
	 .oled_rst(oled_rst),
	 .oled_dcn(oled_dcn),
	 .oled_clk(oled_clk),
	 .oled_dat(oled_dat)
);
//adc例化
ADC_top u_ADC_top(

		    .i_clk_in(clk),
		    .i_rst_in(res),
		    .i_analog_cmp(i_analog_cmp),
		    .o_digital_out(o_digital_out),
		    .o_analog_out(o_analog_out),
		    .o_sample_rdy(sample_rdy)
);


//调用内部时钟(本项目并未成功调用内部时钟)
/*
wire sys_clk;
wire clk2;
HSOSC
#(
   .CLKHF_DIV("0b10")
)u_HSOSC (
 .CLKHFEN (1'b1),
 .CLKHFPU (1'b1),
 .CLKHF   (sys_clk)
);
pll_clk u_pll_clk(
.rst_n_i(res),
.outcore_o(clk2),
.ref_clk_i(sys_clk),
.outglobal_o()
);
*/
endmodule


/*           oled显示的内容         */


MAIN:begin
if(cnt_main >= 5'd15) cnt_main <= 5'd1;//接下来执行空操作,实现数据只刷新一次
   else cnt_main <= cnt_main + 1'b1;
case(cnt_main)	//MAIN状态							
5'd0 :	begin state <= INIT; end
5'd10: begin y_p <= 8'hb5; x_ph <= 8'h17; x_pl <= 8'h08; num <= 5'd1;  char <=display1;state <= SCAN; end//显示bcd转换后的第五位数
5'd11:	begin y_p <= 8'hb5; x_ph <= 8'h16; x_pl <= 8'h08; num <= 5'd1;  char <=display2;state <= SCAN; end//显示bcd转换后的第四位数
5'd12:	begin y_p <= 8'hb5; x_ph <= 8'h15; x_pl <= 8'h08; num <= 5'd1;  char <=display3;state <= SCAN; end//显示bcd转换后的第三位数
5'd13:	begin y_p <= 8'hb5; x_ph <= 8'h14; x_pl <= 8'h08; num <= 5'd1;  char <=display4;state <= SCAN; end//显示bcd转换后的第二位数
5'd14:	begin y_p <= 8'hb5; x_ph <= 8'h13; x_pl <= 8'h08; num <= 5'd1;  char <=".";state <= SCAN; end//显示小数点	
5'd15:	begin y_p <= 8'hb5; x_ph <= 8'h12; x_pl <= 8'h08; num <= 5'd1;  char <=display5;state <= SCAN; end//显示bcd转换后的第一位数



/*   数据处理部分*/
assign o_digital_out_data=(o_digital_out<<7)+o_digital_out;//将测得数据放大128+1倍,后面进行bcd转码即可得到最后显示的数据



/*  bcd解码的例化*/
bin2bcd u_bin2bcd(
.sclk(clk),
.rst_n(rst_n),
.data_i(o_digital_out_data),
.data_o(bcd_out)
);

 

 

 

 

六.项目使用FPGA资源报告

Fvm7YEqmPg-ZHGEsJNL4yaqZaP6Q

Fr4LcvkewbFWivbKt8jbdnexsMdU

 

七.遇到的问题

   本项目的官方sigma-delta-ADC官方提供的ip使用的是62.5MHZ的过采样时钟,而我使用的是12MHZ的时钟.过采样频率低会造成采集的数据不准确.我尝试用FPGA内部时钟通过PLL来达到62.5MHZ的所需时钟,但结果失败.FomWBZL-tvUFTfty2J_bqgiVVWI1

最后通过不断的尝试发现如果我需要使用内部时钟,在程序里面就不能写外部时钟输入的端口,最后通过调用内部时钟经过PLL实现62.6Mhz的过采样率来采集电压.

八.项目总结

   我感觉这次活动最大的意义就是让我明显的感受的到FPGA与MCU逻辑运行上面最大的不同.对自己来说第一次接触FPGA,第一次学习verilog,最后学到了很多东西.

附件下载
sigma_delta_adc_and_oled.rar
团队介绍
2020级安徽师范大学电子信息工程大二赵同学
团队成员
zhaolin0912
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号