A/D转换并用数码管显示

  1. A/D转换总体架构框图

    这里写图片描述

2.顶层模块代码

module ad (pi_clk, pi_rst_n, pi_ad_sda, po_seg7_seg, po_seg7_sel,
                po_ad_scl, po_ad_cs_n);

    input                           pi_clk;// 50MHz
    input                           pi_rst_n;

    input                           pi_ad_sda;

    output  [7:0]               po_seg7_seg;
    output  [2:0]               po_seg7_sel;

    output                      po_ad_scl;
    output                      po_ad_cs_n;

    wire        [7:0]       ad_data;

    ad_drive ad_drive_dut(
                .pi_clk                         (pi_clk), 
                .pi_rst_n                       (pi_rst_n), 
                .pi_ad_sda                      (pi_ad_sda), 
                .po_ad_scl                      (po_ad_scl), 
                .po_ad_cs_n                     (po_ad_cs_n),
                .po_ad_data                     (ad_data), 
                .po_ad_data_flag                ()
            );

    wire        [12:0]  ad_mv;

    convert convert_dut(
                .pi_ad_data                     (ad_data), 
                .po_ad_mv                       (ad_mv)
            );

    wire        [15:0]  show_data;

    bin_to_bcd bin_to_bcd_dut(
                .pi_mv                          (ad_mv), 
                .po_show_data                   (show_data)
            );

    seg7_drive seg7_drive_dut(
                .pi_clk                         (pi_clk), 
                .pi_rst_n                       (pi_rst_n), 
                .pi_show_data                   ({8'h55,show_data}), 
                .po_seg7_sel                    (po_seg7_sel), 
                .po_seg7_seg                    (po_seg7_seg)
            );

endmodule 

3.A/D驱动模块

module ad_drive (pi_clk, pi_rst_n, pi_ad_sda, po_ad_scl, po_ad_cs_n,
                    po_ad_data, po_ad_data_flag);

    input                   pi_clk;
    input                   pi_rst_n;

    input               pi_ad_sda;
    output      reg     po_ad_scl;
    output      reg     po_ad_cs_n;

    output  reg [7:0]   po_ad_data;
    output              po_ad_data_flag;
    reg [7:0] temp;
    reg [11:0] cnt;
    always@(posedge pi_clk or negedge pi_rst_n)
    begin
    if (pi_rst_n==0)
        cnt <= 0;
    else
        begin
            if (cnt==1296)
                cnt <= 0;
            else
                cnt <= cnt + 1;
        end
    end

    always@(posedge pi_clk or negedge pi_rst_n)
    begin
        if (pi_rst_n==0)
            begin
                po_ad_scl<=0;
                po_ad_cs_n<=1;
            end
        else
            begin
                case (cnt)
                        0 : begin
                                po_ad_scl<=0;
                                po_ad_cs_n<=1;
                             end
                        1: begin
                                po_ad_scl<=0;
                                po_ad_cs_n<=0;
                             end
                         71 : begin
                            po_ad_scl<=1;
                            po_ad_cs_n<=0;
                            temp[7]<=pi_ad_sda;
                                end
                         96 : begin
                            po_ad_scl<=0;
                            po_ad_cs_n<=0;
                                end
                         121 : begin
                            po_ad_scl<=1;
                            po_ad_cs_n<=0;
                            temp[6]<=pi_ad_sda;
                                end
                         146 : begin
                            po_ad_scl<=0;
                            po_ad_cs_n<=0;
                            end
                            171 : begin
                            po_ad_scl<=1;
                            po_ad_cs_n<=0;
                            temp[5]<=pi_ad_sda;
                                end
                         196 : begin
                            po_ad_scl<=0;
                            po_ad_cs_n<=0;
                            end
                            221 : begin
                            po_ad_scl<=1;
                            po_ad_cs_n<=0;
                            temp[4]<=pi_ad_sda;
                                end
                         246 : begin
                            po_ad_scl<=0;
                            po_ad_cs_n<=0;
                            end
                            271 : begin
                            po_ad_scl<=1;
                            po_ad_cs_n<=0;
                            temp[3]<=pi_ad_sda;
                                end
                         296 : begin
                            po_ad_scl<=0;
                            po_ad_cs_n<=0;
                            end
                            321 : begin
                            po_ad_scl<=1;
                            po_ad_cs_n<=0;
                            temp[2]<=pi_ad_sda;
                                end
                         346 : begin
                            po_ad_scl<=0;
                            po_ad_cs_n<=0;
                            end
                            371 : begin
                            po_ad_scl<=1;
                            po_ad_cs_n<=0;
                            temp[1]<=pi_ad_sda;
                                end
                         396 : begin
                            po_ad_scl<=0;
                            po_ad_cs_n<=0;
                            end
                            421 : begin
                            po_ad_scl<=1;
                            po_ad_cs_n<=0;
                            temp[0]<=pi_ad_sda;
                                end
                         446 : begin
                            po_ad_scl<=0;
                            po_ad_cs_n<=1;
                            end
                            447: begin
                            po_ad_data<=temp;
                                end
                endcase
            end
    end



endmodule 

4.数据转电压模块

module convert (pi_ad_data, po_ad_mv);

    input           [7:0]           pi_ad_data;

    output      reg [12:0]      po_ad_mv;

    always@(*)
        begin
            po_ad_mv <= pi_ad_data*2500/256;
        end



endmodule 

5.二进制转bcd模块
module bin_to_bcd (pi_mv, po_show_data);

input           [12:0]      pi_mv;

output      reg [15:0]      po_show_data;

always@(*)
    begin
        po_show_data [3:0] <= pi_mv % 10;
        po_show_data [7:4] <= (pi_mv/10) % 100;
        po_show_data [11:8] <= (pi_mv/100) % 10;
        po_show_data [15:12] <= pi_mv / 1000;
    end

endmodule
5.数码管驱动模块
module seg7_drive(pi_clk, pi_rst_n, pi_show_data, po_seg7_sel, po_seg7_seg);
input pi_clk, pi_rst_n;
input [15:0] pi_show_data;
output reg [2:0] po_seg7_sel;
output reg [7:0] po_seg7_seg;

//reg [4:0] cnt;

reg [31:0] cnt_1ms;
reg pi_clk_1ms;
reg [3:0] temp;

parameter T=50_000;///1ms freq

always @ (posedge pi_clk or negedge pi_rst_n)
begin if(!pi_rst_n)
begin
cnt_1ms<=0;
pi_clk_1ms<=1;
end
else if(cnt_1ms==T/2-1’b1)
begin
cnt_1ms<=0;
pi_clk_1ms<=~pi_clk_1ms;
end
else begin
cnt_1ms<=cnt_1ms+1’b1;
pi_clk_1ms<=pi_clk_1ms;
end
end
always @ (posedge pi_clk_1ms or negedge pi_rst_n)
begin
if (!pi_rst_n)
po_seg7_sel <= 3’b000;
else if (po_seg7_sel < 3’d5)
po_seg7_sel <= po_seg7_sel +1’b1;
else
po_seg7_sel <= 0;
end
always @ (*)
begin
if (!pi_rst_n)
temp = 0;
else
case (po_seg7_sel)

            3'd0:   temp = 4'h0;
            3'd1:   temp = 4'h0;
            3'd2:   temp = pi_show_data[15:12];
            3'd3:   temp = pi_show_data[11:8];

            3'd4:   temp = pi_show_data[7:4];
            3'd5:   temp = pi_show_data[3:0];
        default : temp = 4'h0;
        endcase

end
always @ (*)
begin
if (!pi_rst_n)
begin
po_seg7_seg = 8’b1111_1111;
end
else
begin
case (temp)
0 : po_seg7_seg = 8’b1100_0000; //d0
1 : po_seg7_seg = 8’b1111_1001; //d1
2 : po_seg7_seg = 8’b1010_0100; //d2
3 : po_seg7_seg = 8’b1011_0000; //d3
4 : po_seg7_seg = 8’b1001_1001; //d4
5 : po_seg7_seg = 8’b1001_0010; //d5
6 : po_seg7_seg = 8’b1000_0010; //d6
7 : po_seg7_seg = 8’b1111_1000; //d7
8 : po_seg7_seg = 8’b1000_0000; //d8
9 : po_seg7_seg = 8’b1001_0000; //d9
10 : po_seg7_seg = 8’b1000_1000; //dA
11 : po_seg7_seg = 8’b1000_0011; //db
12 : po_seg7_seg = 8’b1100_0110; //dC
13 : po_seg7_seg = 8’b1010_0001; //dd
14 : po_seg7_seg = 8’b1000_0110; //dE
15 : po_seg7_seg = 8’b1000_1110; //dF
default : po_seg7_seg = 8’b1111_1111; //null
endcase
end
end
endmodule

总结

A/D转换用数码管显正常,但是最后一位不稳定需要加均值滤波器加以改进,结果如图这里写图片描述

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值