XADC 数字电压表 OLED 显示与自动量程 Verilog Vivado

名称:XADC 数字电压表 OLED 显示与自动量程 Verilog Vivado

软件:Vivado

语言:Verilog

功能介绍

本设计使用 FPGA 内部 XADC 构建数字电压表,以 Verilog 实现采样读取、电压处理、矩阵键盘菜单和 OLED 显示。被测端面向 0~5 V 单极性电压,通过外部分压接入 XADC 的 VP/VN 模拟输入,适合直流电压测量以及带小幅纹波信号的平均电压观察。

OLED 显示当前菜单量程 RANGE、换算电压 VIN、平均后的 12 位原始码 RAW 和状态 ST。量程支持手动 mV、手动 V 与 AUTO 自动模式;小电压采用 mV 显示,格式分辨率为 0.1 mV,较大电压采用 V 显示,格式为 0.001 V。显示位数用于数值呈现,测量误差仍与分压比、输入电路和校准有关。

4×4 矩阵键盘提供 A 切换 mV、B 切换 V、C 切换自动量程、D 校零、E 清除校零等操作,LED 指示实际显示档位、自动量程及超量程状态。设计同时提供 hx_xadc 基础采样调试工程和 voltmeter_top 完整电压表工程,便于先理解 XADC 读取与 ILA 观察,再学习采样处理、交互控制和显示集成。

运行环境

开发语言为 Verilog,开发软件为 Vivado。完整数字电压表工程 voltmeter_xadc 使用 Vivado 2018.3 完成综合、实现和 bitstream 生成,顶层为 voltmeter_top,目标器件为 xc7a75tfgg484-2,开发板为 HX7A75C。基础 XADC 调试工程顶层为 hx_xadc,使用 XADC Wizard 与 ILA IP。

运行所需外设包括 OLED、4×4 矩阵键盘及外部分压电路;下载使用 JTAG,直流测试可配合函数发生器和万用表。OLED 供电按模块要求连接,参考接法使用开发板 3.3 V。被测信号、分压电路和开发板必须共地,0~5 V 被测电压经过分压后才能接入 VP/VN,XADC 端电压须保持在 0~1 V 范围内。

设计思路

设计先通过外部分压把被测端的 0~5 V 单极性电压转换到 XADC VP/VN 输入允许的 0~1 V 范围,再由 FPGA 读取采样码并完成电压换算。推荐分压电阻为 R1=4.02 MΩ、R2=1.00 MΩ,分压点串联 100 Ω 接入 VP_IN;5.00 V 输入时,分压点约为 0.996 V。数字换算按 5:1 比例设计,因此这一留有余量的电阻组合会带来约 0.4% 的比例偏差,需要更高准确度时可通过校准修正。

基础采样模块 hx_xadc 例化 xadc_wiz_0,在 eoc_out 有效时根据 channel_out 生成读取地址并置高 den_in。drdy_out 延迟一个时钟后与当前状态比较,在其下降沿对应的时钟周期将 do_out[15:4] 保存为 12 位采样码。ILA 同时观察数据总线、寄存器地址、通道号和转换状态,便于核对采样与读取时序。

完整电压表采用 2^18 点长窗口平均,再进行显示与菜单控制。采样率接近参考 IP 配置时,平均窗口约为 0.27 s,设计上用于减小 50 Hz、60 Hz 纹波对平均电压显示的影响。OLED 预期约每秒刷新 3~4 次,具体刷新与稳定过程可通过直流电压切换和叠加小幅纹波进行验证。

量程菜单与采样通道分开处理:手动 mV/V 档改变显示单位和格式,自动量程根据电压大小选择显示档位。校零操作记录当前原始码作为零点偏移,清除操作恢复零点偏移为零。OLED 的 RAW 与状态行用于辅助判断输入、校零及超量程状态;该处理链输出平均电压,交流真有效值测量需要另行增加 RMS 计算或相应模拟前端。

模块结构

基础采样工程以 hx_xadc 为顶层,连接 sys_clk、vp_in、vn_in,并例化 xadc_wiz_0 与 ila_0。前者负责 XADC 接口,后者观察 do_out、daddr_in、channel_out、drdy_out、eoc_out、eos_out 和 busy_out 等信号。下方代码展示的是这一基础采样顶层。

完整数字电压表以 voltmeter_top 为顶层,采样与处理部分包括 xadc_vpvn_reader、voltage_processor,键盘与菜单部分包括 key44、keypad_menu。OLED 显示部分由 oled_text_display、oled_init、oled_clear、oled_write_char、oled_font6x8 和 spi_master 等模块组成,分别组织显示内容、初始化、清屏、字符输出、字模与串行传输。

配套参考工程还包括 hx75_key_7seg 和 hx75_OLED,可用于学习矩阵键盘、数码管及 OLED 外设的独立控制,再与电压表中的交互和显示模块对照理解。

开发板验证

数字电压表面向 HX7A75C 开发板,配有管脚约束、开发板实物照片和分压电路图。上板调试使用 voltmeter_top.bit,通过 Vivado Hardware Manager 连接 JTAG 并下载至 xc7a75t 器件。

模拟输入连接为:分压后的 VP_IN 接 SMA2,对应 L10;模拟地 VN_IN 接 SMA1,对应 M9。OLED 的 sck、miso、reset_oled、dc、cs 分别对应 T4、T5、U5、W6、W5,其中 miso 在本设计中作为 OLED 串行数据输出。矩阵键盘 row[0:3] 分别连接 T3、T1、U1、U2,col[0:3] 分别连接 V2、R3、R2、W2,行输入启用内部上拉。

验证可按 OLED 显示、按键切换、零点、小电压、中点和满量程的顺序进行。0.100 V 与 2.500 V 可用于检查自动量程显示,A/B 可用于比较同一输入在 mV 与 V 格式下的数值,D/E 可用于检查校零与清除校零。LED 分别指示实际 mV 档、实际 V 档、自动量程模式和超量程状态。满量程测试前,应先用万用表确认分压后的 VP_IN 小于 1 V,再接入 XADC。

XADC 数字电压表 OLED 显示与自动量程 Verilog Vivado 开发板验证图片 开发板照片.jpg

XADC 数字电压表 OLED 显示与自动量程 Verilog Vivado 开发板验证图片 xadc_divider_circuit.png

仿真图/仿真说明/设计文档图片

数字电压表调试说明覆盖分压电路、OLED 与矩阵键盘接线、LED 状态、JTAG 下载、量程切换、校零、平均电压观察和常见故障处理,并配有设计文档图片与分压电路图,便于按步骤搭建和调试。

基础 XADC 工程保留 ILA 硬件采集数据及波形配置,可配合采样顶层中的探针连接检查数据读取过程。OLED 参考工程带有 tb 测试平台,适合对照学习显示模块的仿真组织方式。

XADC 数字电压表 OLED 显示与自动量程 Verilog Vivado 设计文档图片 image2.png

部分代码

以下展示顶层模块 hx_xadc 的部分代码,完整源码请下载压缩包查看。

module hx_xadc(
    input sys_clk  ,      //系统时钟
    input vp_in,
    input vn_in
    );
	
	reg den_in;
    wire dwe_in;
    wire drdy_out;              //数据有效输出
    wire [15:0] di_in, do_out;  //数据输入 数据输出
    reg [6:0] daddr_in;        //寄存器地坿
    wire [4:0] channel_out;     // 通道选择输出
    wire eoc_out;               // 转换完成信号
    wire eos_out;               // 时序结束信号
    wire alarm_out;
    wire busy_out;
    wire rst_n;
    //模拟通道读取的ADC
    reg [11:0] vpvnData;
    wire [11:0] xadc_vpvn_data_T;
	
	xadc_wiz_0 inst_xadc (
      .di_in(di_in),              // input wire [15 : 0] di_in
      .daddr_in(daddr_in),        // input wire [6 : 0] daddr_in
      .den_in(den_in),            // input wire den_in
      .dwe_in(1'b0),            // input wire dwe_in
      .drdy_out(drdy_out),        // output wire drdy_out
      .do_out(do_out),            // output wire [15 : 0] do_out
      .dclk_in(sys_clk),          // input wire dclk_in
      .reset_in(1'b0),        // input wire reset_in
      .vp_in(vp_in),              // input wire vp_in
      .vn_in(vn_in),              // input wire vn_in
      .channel_out(channel_out),  // output wire [4 : 0] channel_out
      .eoc_out(eoc_out),          // output wire eoc_out
      .alarm_out(alarm_out),      // output wire alarm_out
      .eos_out(eos_out),          // output wire eos_out
      .busy_out(busy_out)        // output wire busy_out
    );
	
	reg drdy_out_reg = 0;
    always@(posedge sys_clk)
        drdy_out_reg <= drdy_out;
		
	always @(posedge sys_clk) begin
        if (drdy_out == 0 && drdy_out_reg == 1) begin
          vpvnData <= do_out[15:4]; 
            
        end
        
    end
	
	always @(posedge sys_clk) begin
        if (eoc_out) begin
          daddr_in <= {2'b00, channel_out}; 
          den_in <= 1'b1;                    //产生den_in丿个时钟周期的高电广  
        end
        else begin
            daddr_in <= 7'd0;
            den_in <= 1'b0;
        end		  
    end
	
	ila_0 inst_ila (
	.clk(sys_clk), // input wire clk


	.probe0(do_out), // input wire [15:0]  probe0  
	.probe1(daddr_in), // input wire [6:0]  probe1 
	.probe2(channel_out), // input wire [4:0]  probe2 
	.probe3(drdy_out), // input wire [0:0]  probe3 
	.probe4(eoc_out), // input wire [0:0]  probe4 
	.probe5(eos_out), // input wire [0:0]  probe5 
	.probe6(busy_out) // input wire [0:0]  probe6
);
		
endmodule

代码文件(付费下载)

📥 付费后此处显示完整工程压缩包下载链接。
1、代码文件需要付费后才可见。
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » XADC 数字电压表 OLED 显示与自动量程 Verilog Vivado

注册为本站会员,充值100得150,详情咨询客服

目前为止共有 *** 位优秀的会员加入! 立刻加入会员