一.项目介绍
该项目是利用 ICE40UP5K FPGA核心板和扩展版实现数字电压表的功能.实现过程是利用FPGA内部逻辑加上外部高速比较器实现sigma-delta-ADC,将采集的的电压在oled显示器上面显示.
二.硬件介绍
硬件部分分为核心板和扩展版
扩展版包括:两个按键
4个单色LED
12个WS2812B RGB三色灯
1姿态传感器
1个128*64OLED显示器
1个蜂鸣器
1个可调电位器
一路音频信号输入
8位R-2R电阻网络构成的DAC
核心板主要包括:
ICE40FPGA
LPC11U35下载器
两个高速比较器
三.设计思路
设计流程图
第一步实现过程:调用lattice官方sigma-delta-ADC的ip
第三步实现过程:顶层例化时将ADC模块与OLED模块相连接
第四步实现过程:在网上查找实现二进制到BCD转码的相关算法
四.实现功能及图片展示
能够实现0-3.3v的电压采集和显示
1.最大电压显示
2.最小电压显示
3.中间电压显示
五.主要代码片段及说明
//顶层文件
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资源报告
七.遇到的问题
本项目的官方sigma-delta-ADC官方提供的ip使用的是62.5MHZ的过采样时钟,而我使用的是12MHZ的时钟.过采样频率低会造成采集的数据不准确.我尝试用FPGA内部时钟通过PLL来达到62.5MHZ的所需时钟,但结果失败.
最后通过不断的尝试发现如果我需要使用内部时钟,在程序里面就不能写外部时钟输入的端口,最后通过调用内部时钟经过PLL实现62.6Mhz的过采样率来采集电压.
八.项目总结
我感觉这次活动最大的意义就是让我明显的感受的到FPGA与MCU逻辑运行上面最大的不同.对自己来说第一次接触FPGA,第一次学习verilog,最后学到了很多东西.