打印
[FPGA]

Verilog实现16位AD转换读写(ADS8557)

[复制链接]
3269|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chen文爵|  楼主 | 2018-4-16 07:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
刚学习FPGA,肯定有许多不足和bug,作为一个学习记录吧
module ADS(clk,rst_n,XD, RESET, CONVST, RD, CS, BUSY, A0, A1, A2);
        input clk;                                // 50MHz主时钟
        input rst_n;                        //低电平复位信号
        input [15:0]XD;        //定义AD转换结果的16位数据并行输入端口
        wire [15:0]XD;                //类型为wire型(默认就是)
        output RESET;                //复位AD芯片输出信号端口
        output CONVST;                //启动AD转换输出信号端口
        output RD;                        //读AD转换结果输出信号端口
        output CS;                        //AD芯片片选信号端口(多个AD芯片时有用)
        input BUSY;                        //AD转换完成标志,输入端口。用于判断是否转换完成
        output[15:0] A0;        //AD芯片是6通道,这里输出三路结果A0 A1 A2
        output[15:0] A1;
        output[15:0] A2;
       
        reg RESET;                        //定义数据类型
        reg CONVST;
        reg RD;
        reg CS;
       
        reg[3:0] CONVST_state;                        //状态机状态定义
        reg[7:0] CONVST_2us;                                //延时2us寄存器
        reg[15:0] CONVST_DATA[5:0];        //定义6个16位宽的寄存器,用于存储转换结果
        reg[3:0] RD_30ns;                                        //读AD数据延时时间寄存器
        reg[3:0] RESET_50ns;                                //AD芯片复位至少50ns,延时寄存器
        reg[3:0] RD_DELAY;                                //读AD转换结果通道,状态机状态标志寄存器
        reg[3:0] channel;

always @ (posedge clk or negedge rst_n)
        if(!rst_n)
                begin
                        CONVST_state<=4'd0;                //一些复位操作
                        CONVST_2us<=8'd0;
                        RD_30ns<=4'd0;
                        RESET_50ns<=4'd0;
                        RD_DELAY<=4'd0;
                        channel<=4'd0;
                        RESET<=1'b1;//RESET至少保持50ns
                        CONVST<=1'b0;
                        RD<=1'b1;
                        CS<=1'b1;
                end
        else
                case(CONVST_state)
                        0: begin                //启动AD转换
                                        RESET<=1'b0;
                                        CONVST<=1'b1;//延时至少1.2us完成转换
                                        CONVST_2us<=CONVST_2us+1'b1;
                                        if(CONVST_2us==60)
                                                begin
                                                        CONVST_state<=4'd1;
                                                        CS<=1'b0;
                                                end
                                        else
                                                CONVST_state<=4'd0;
                                end
                        1: begin                //AD转换完成
                                        CONVST<=1'b0;//
                                        CONVST_2us<=1'b0;
                                        if(BUSY==1'b0)
                                                begin
                                                        CONVST_state<=4'd2;
                                                end
                                        else
                                                CONVST_state<=4'd1;
                                end
                        2:        begin
                                        RD<=1'b0;
                                        CONVST_state<=4'd3;
                                end
                        3:        begin                                                                //读取AD转换结果,每个通道读取时间时间不能少于30ns
                                        RD_30ns<=RD_30ns+1'b1;
                                        case(channel)                                //channel状态机依次读取AD转换结果的6个通道数据
                                                0:        begin       
                                                                if(RD_30ns==0)
                                                                        channel<=4'd0;
                                                                else
                                                                        begin
                                                                                channel<=4'd1;
                                                                                CONVST_DATA[0]<=XD;
                                                                        end
                                                        end
                                                1:        begin
                                                                CONVST_DATA[1]<=XD;
                                                                if(RD_30ns==0)
                                                                        channel<=4'd1;
                                                                else
                                                                        channel<=4'd2;
                                                        end
                                                2:        begin
                                                                CONVST_DATA[2]<=XD;
                                                                if(RD_30ns==0)
                                                                        channel<=4'd2;
                                                                else
                                                                        channel<=4'd3;
                                                        end
                                                3:        begin
                                                                CONVST_DATA[3]<=XD;
                                                                if(RD_30ns==0)
                                                                        channel<=4'd3;
                                                                else
                                                                        channel<=4'd4;
                                                        end
                                                4:        begin
                                                                CONVST_DATA[4]<=XD;
                                                                if(RD_30ns==0)
                                                                        channel<=4'd4;
                                                                else
                                                                        channel<=4'd5;
                                                        end
                                                5:        begin
                                                                CONVST_DATA[5]<=XD;
                                                                if(RD_30ns==0)
                                                                        channel<=4'd5;
                                                                else
                                                                        channel<=4'd0;
                                                        end
                                        endcase                                       
                                        if(RD_30ns==1)
                                                begin
                                                        RD<=1'b1;
                                                        RD_30ns<=4'd0;
                                                        if(channel==5)
                                                                begin
                                                                        CONVST_state<=4'd4;
                                                                        CS<=1'b1;
                                                                end
                                                        else
                                                                begin
                                                                        CONVST_state<=4'd2;
                                                                end
                                                end
                                        else
                                                CONVST_state<=4'd3;
                                end
                        4: begin
                                        RESET_50ns<=RESET_50ns+1'b1;
                                        if(RESET_50ns==1)
                                                begin
                                                        CONVST_state<=4'd0;
                                                        RESET_50ns<=4'd0;
                                                end
                                        else
                                                CONVST_state<=4'd4;
                                end
                endcase
               
                assign A0 = CONVST_DATA[0];        //将结果连接至模块输出端口
                assign A1 = CONVST_DATA[1];
                assign A2 = CONVST_DATA[2];
               
               
endmodule

相关帖子

沙发
ghwcxh| | 2018-4-24 07:55 | 只看该作者
验证通过吗??可以作为应用使用吗??

使用特权

评论回复
板凳
gaochy1126| | 2018-4-29 20:25 | 只看该作者
这个ADS8557是什么转换接口的呢?不是并口直接读写吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

5

帖子

0

粉丝