内容介绍
内容介绍
一、项目介绍
此项目是基于Lattice XO2-4000HC FPGA完成的一个数字电压表,具体功能如下:
1、旋转电位计可以产生0-3.3V的电压
2、利用板上的串行ADC对电压进行转换
3、将电压值在板上的OLED屏幕上显示出来
二、主要电子元件和模块介绍
1、12832OLED
OLED12832模块,使用SPI串行总线通信,屏幕集成了SSD1306驱动芯片进行屏幕驱动。
2、ADS7868
ADS7868芯片,是一款8位ADC速度能达到200KSPS,通过SPI总线将输出传输出来。电路还包含了一个可调电位器产生0-3.3v的电压。
三、代码实现
先放个网图
下面是管脚分配图
顶层模块
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
查看更多