• ad7928


    module    ad_pro(
            clk,rst_n,
            smg1,smg2,smg3,
            dout,cs_n,din,clk_50k//12.5M
    );
    input        clk;
    input        rst_n;
    input        dout;
    output    reg    [7:0]        smg1;
    output    reg    [7:0]        smg2;
    output    reg    [7:0]        smg3;
    output    reg        cs_n;
    output    reg        din;
    output    reg        clk_50k;
    
    //50K时钟
    reg        [8:0]        cnt_50k;
    always@(negedge clk or negedge rst_n)
        if(!rst_n)begin
            cnt_50k <= 'd0;
            clk_50k <= 'd0;
        end
        else if(cnt_50k == 2'd2)begin        //12.5M
            cnt_50k <= 'd0;
            clk_50k =~ clk_50k;
        end
        else
            cnt_50k <= cnt_50k + 1'b1;
            
            
    //fsm
    parameter    din_regis = 16'b100_001_110_001_0000;
    reg        [3:0]        state;
    reg        [15:0]    ad_buffer;
    reg        [9:0]        ad_buffer1;
    reg        [3:0]        num_din;
    reg        [3:0]        num_dout;
    reg        [15:0]    temp;    
    always @(posedge clk_50k or negedge rst_n)
        if(!rst_n)begin
            cs_n <= 1'd1;
            din <= 1'd1;
            state <= 'd0;
            num_din <= 4'd15;
            num_dout <= 'd0;
            ad_buffer <= 'd0;
            ad_buffer1 <= 'd0;
        end
        else
        case(state)
        4'd0:begin
                cs_n <= 1'd1;
                state <= state + 1'b1;
                num_din <= 4'd15;
                num_dout <= 4'd0;
                ad_buffer <= 'd0;
                //ad_buffer1 <= 'd0;
            end
        4'd1:begin
                //cs_n <= 1'd0;
                //din <= 1'd1;
                state <= state + 1'b1;
            end
        4'd2:begin   //写寄存器
                cs_n <= 1'd0;
                din <= (din_regis >> num_din) & 1;
                num_din <= num_din - 1'b1;
                ad_buffer <= (ad_buffer << 1) | dout;
                num_dout <= num_dout + 1'b1;
                if(num_dout == 4'd15 && num_din == 4'd0)
                    state <= state + 1'b1;
                else
                    state <= state;
            end
        4'd3:begin
                ad_buffer1 <= (ad_buffer[11:4]*100/51);
                cs_n <= 1'd1;
                state <= 1'd0;
            end
        endcase
    //smg display
    //0~9的键值  共阴极
    parameter _0=8'hc0,_1=8'hf9,_2=8'ha4,_3=8'hb0,_4=8'h99,
                 _5=8'h92,_6=8'h82,_7=8'hf8,_8=8'h80,_9=8'h90;
    always @(posedge clk or negedge rst_n)
        if(!rst_n)begin
            smg1 <= 8'h0;
        end
        else 
        case(ad_buffer1/100)
        4'd0:smg1 <= _0;
        4'd1:smg1 <= _1;
        4'd2:smg1 <= _2;
        4'd3:smg1 <= _3;
        4'd4:smg1 <= _4;
        4'd5:smg1 <= _5;
        4'd6:smg1 <= _6;
        4'd7:smg1 <= _7;
        4'd8:smg1 <= _8;
        4'd9:smg1 <= _9;
        endcase
        
    always @(posedge clk or negedge rst_n)
        if(!rst_n)begin
            smg2 <= 8'h0;
        end
        else 
        case(ad_buffer1%100/10)
        4'd0:smg2 <= _0;
        4'd1:smg2 <= _1;
        4'd2:smg2 <= _2;
        4'd3:smg2 <= _3;
        4'd4:smg2 <= _4;
        4'd5:smg2 <= _5;
        4'd6:smg2 <= _6;
        4'd7:smg2 <= _7;
        4'd8:smg2 <= _8;
        4'd9:smg2 <= _9;
        endcase
    
    always @(posedge clk or negedge rst_n)
        if(!rst_n)begin
            smg3 <= 8'h0;
        end
        else 
        case(ad_buffer1%10)
        4'd0:smg3 <= _0;
        4'd1:smg3 <= _1;
        4'd2:smg3 <= _2;
        4'd3:smg3 <= _3;
        4'd4:smg3 <= _4;
        4'd5:smg3 <= _5;
        4'd6:smg3 <= _6;
        4'd7:smg3 <= _7;
        4'd8:smg3 <= _8;
        4'd9:smg3 <= _9;
        endcase
    
    
    
    
    endmodule

    这次有待解决的问题是如何把八位数据通过移位的方法变成小数形式

    总结:fpga会自动舍弃小数部分,所以要乘一个数来增加精确度

       注意位宽因为定义尾位宽不够,所以buffer1出来的数据不准确

       注意datasheet给定的时钟,刚开始因为时钟频率过小,导致数字有的点闪

  • 相关阅读:
    iOS 网络优化--页面返回的时候取消网络请求
    iOS 内存管理
    realm数据库使用
    KNN 算法分类电影类型
    sklearn库学习之01
    Python 生成4位验证码图片
    Python——读写Excel文件
    KNN--用于手写数字识别
    Python基础学习-'module' object has no attribute 'urlopen'解决方法
    swift_通知的使用
  • 原文地址:https://www.cnblogs.com/bixiaopengblog/p/6443949.html
Copyright © 2020-2023  润新知