2021暑假一起练-利用ADC制作一个数字电压表
本项目基于lattice Mxo2-4000hc的小脚丫平台,本项目主要使用的元件和模块为12832OLED、3386P-1-103T电位器、ADS7868、数码管。
标签
FPGA
数字逻辑
显示
mcu
更新2021-09-14
1049

一、项目介绍

   此项目是基于Lattice XO2-4000HC FPGA完成的一个数字电压表,具体功能如下:

   1、旋转电位计可以产生0-3.3V的电压

   2、利用板上的串行ADC对电压进行转换

   3、将电压值在板上的OLED屏幕上显示出来

二、主要电子元件和模块介绍

   1、12832OLED

   OLED12832模块,使用SPI串行总线通信,屏幕集成了SSD1306驱动芯片进行屏幕驱动。

FprkuINPphAQdG4rLw0JldEA1mHN

   2、ADS7868

   ADS7868芯片,是一款8位ADC速度能达到200KSPS,通过SPI总线将输出传输出来。电路还包含了一个可调电位器产生0-3.3v的电压。

Fkzlcvsdiwx7GbpqjrUZStFXngKr

三、代码实现

 先放个网图FkF-9Lu5FiByN7eMxTWXsAStESkb

下面是管脚分配图

Forl-rrQmWIaCCftGm6SbT9fG6KrFtn-bcELxbI8Gcgs6He6_a8n9f17

顶层模块

module voltmeter
(
input				clk,		//系统时钟
input				rst_n,		//系统复位,低有效

output				adc_cs,		//SPI总线CS
output				adc_clk,	//SPI总线SCK
input				adc_dat,	//SPI总线SDA

output  			seg1_sel,	//数码管位选
output  	[7:0]	        seg1_led,	//数码管段选
output  			seg2_sel,	//数码管位选
output  	[7:0]	        seg2_led,	//数码管段选

output				oled_csn,	//OLCD液晶屏使能
output				oled_rst,	//OLCD液晶屏复位
output				oled_dcn,	//OLCD数据指令控制
output				oled_clk,	//OLCD时钟信号
output				oled_dat	//OLCD数据信号
);

wire adc_done;
wire [7:0] adc_data;

//ADC功能,例化
ADS7868 u2
(
.clk				(clk			),	//系统时钟
.rst_n				(rst_n			),	//系统复位,低有效
.adc_cs				(adc_cs			),	//SPI总线CS
.adc_clk			(adc_clk		),	//SPI总线SCK
.adc_dat			(adc_dat		),	//SPI总线SDA
.adc_done			(adc_done		),	//ADC采样完成标志
.adc_data			(adc_data		)	//ADC采样数据
);

//将ADC采样数据按规则转换为电压数据(乘以0.0130),这里我们直接乘以129,得到的数据经过BCD转码后小数点左移4位即可
wire [15:0]	bin_code = adc_data * 16'd130;
wire [19:0]	bcd_code;

//将处理后的ADC数据进行BCD转码,例化
bin_to_bcd u3
(
.rst_n				(rst_n			),	//系统复位,低有效
.bin_code			(bin_code		),	//需要进行BCD转码的二进制数据
.bcd_code			(bcd_code		)	//转码后的BCD码型数据输出
);

//Segment led display module
segled segled[1:0] 
(
.seg_data			(bcd_code[19:12]	),	//seg_data input
.seg_dot			({1'b1,1'b0}		),	//segment dot control
.seg_sel			({seg1_sel,seg2_sel}),	//segment com port
.seg_led			({seg1_led,seg2_led})	//MSB~LSB = DP,G,F,E,D,C,B,A
); 


oled12832 u4
(
.clk                (clk            ),		//12MHz系统时钟
.rst_n	            (rst_n          ),	        //系统复位,低有效	
.data		    (bcd_code[19:12]),	
.oled_clk           (oled_clk       ),
.oled_csn           (oled_csn       ),
.oled_dat           (oled_dat       ),
.oled_dcn           (oled_dcn       ),
.oled_rst           (oled_rst       )
);

endmodule

OLED直接使用了小脚丫提供的驱动,修改了MAIN部分

							5'd0:	begin state <= INIT; end
							5'd1:	begin y_p <= 8'hb0; x_ph <= 8'h10; x_pl <= 8'h00; num <= 5'd16; char <= "                ";state <= SCAN; end
							5'd2:	begin y_p <= 8'hb1; x_ph <= 8'h10; x_pl <= 8'h00; num <= 5'd16; char <= "     voltage:   ";state <= SCAN; end
							5'd3:	begin y_p <= 8'hb2; x_ph <= 8'h10; x_pl <= 8'h00; num <= 5'd16; char <= "       . V      ";state <= SCAN; end
							5'd4:	begin y_p <= 8'hb3; x_ph <= 8'h10; x_pl <= 8'h00; num <= 5'd16; char <= "----------------";state <= SCAN; end
							
							//5'd5:	begin y_p <= 8'hb0; x_ph <= 8'h15; x_pl <= 8'h00; num <= 5'd 1; char <= data[3:0]; state <= SCAN; end
							//5'd5:	begin y_p <= 8'hb1; x_ph <= 8'h15; x_pl <= 8'h00; num <= 5'd 3; char <={data[7:4],"."data[3:0]}; state <= SCAN; end
							5'd5:	begin y_p <= 8'hb2; x_ph <= 8'h13; x_pl <= 8'h00; num <= 5'd 1; char <=data[7:4]; state <= SCAN; end
							5'd6:	begin y_p <= 8'hb2; x_ph <= 8'h14; x_pl <= 8'h00; num <= 5'd 1; char <=data[3:0]; state <= SCAN; end
							//5'd6:	begin y_p <= 8'hb3; x_ph <= 8'h15; x_pl <= 8'h00; num <= 5'd 1; char <= "O"; state <= SCAN; end
四、心得与体会
   通过本次“暑假一起练”项目,我对FPGA和Verilog编程有了初步的了解,动手能力和自主学习能力得到了锻炼。虽然我目前的水平还不能独立写出很复杂的代码,但是在阅读他人写好的案例的过程中,我也可以学到很多知识。电子森林中有丰富的文档和资料,希望日后能够通过进一步的学习和练习,提高自身的编程能力。
附件下载
digital_voltmeter_impl1.jed
digital_voltmeter.zip
团队介绍
内蒙古工业大学,纺织工程专业,初次接触FPGA
团队成员
mcu
祁建鑫
一个喜欢3D打印、机器人、嵌入式的爱好者
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号