查看: 3562|回复: 0

【MAX10初体验】片内ADC的使用

[复制链接]
  • TA的每日心情
    奋斗
    2015-1-31 21:47
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2015-1-26 10:03:59 | 显示全部楼层 |阅读模式
    分享到:
    一、片内ADC横向对比
          片内ADC,做单片机开发或者FPGA开发应该都不会陌生。单片机都会带有一个片内ADC,高端的FPGA由于高频工作发热太大,一般也会带有ADC用作芯片温度检测,多出来的通道,用户可以任意发挥。
           MAX10的片内ADC性能中规中矩,最大的亮点就是,面向低成本的FPGA也提供了片内ADC,屌丝大爱。
          下面列举了几款不同芯片的片内ADC的参数,供大家对比参考:


          MAX10 ADC物理特性(节选自datasheet):

    MAX10 ADC结构(节选自datasheet)




    二、MAX10 初体验——片内ADC的使用
            1.在IP Catalog里面搜索adc,双击打开,居然打开了Qsys。看来Altera的这个ADC跟nios血缘更近。不过不用担心,即便是nios也能把他的IO拉出来,最坏的情况就是自己写avalon总线的逻辑。
            由于我只想用逻辑完全控制,选择了ADC control core only,这个模式用户可以自由的控制转换通道。
             
             PS:当在设置时钟频率的时候,右侧有提示“ADC的时钟由PLL1或PLL3的C0驱动,由于ADC内核必须工作在1M下,ADC核内的分频器只能接受1M的整数倍时钟”。有的片子有两个ADC,必须使用adc对应的PLL驱动,否则实现会报错。
             2.在生成HDL之前,我们看一下IP核的IO,在右上侧点击block symbol,了解一下信号功能位宽及方向。
                   
                        IP核接口信号功能,参见代码注释。
             3.生成HDL
                生成HDL后,将生成的synthesis目录里面的qip文件添加到工程中。qip文件为索引文件,quartus将根据索引路径获取综合仿真所需的文件。
             4.例化PLL
                打开PLL IP,设置C0输出为40M(对应ADC IP核中的时钟,ADC核将把此时钟分频到1M供采样使用),C1为80M。
                其中C1为用户逻辑用时钟,可根据实际情况设置。此时钟也需要提供给ADC核,以便与用户接口同时钟域。
            5.程序源码:
    module adc_test(input wire i_clk,input wire i_rst_n,output wire adc_valid,output wire [4:0]adc_chnanel,output wire [11:0]adc_data,output wire clk80);wire clk40;wire rst;   wire locked;   pll u_pll (        .areset                (~i_rst_n ),        .inclk0                (i_clk    ),        .c0                (clk40    ),//c0 for adc        .c1         (clk80    ),//c1 for user logic        .locked                (locked   ));assign rst = ~( i_rst_n & locked );adc u0_adc (        .clock_clk              (clk80       ), //user_clk        .reset_sink_reset_n     (~rst        ), //user_reset_n        .adc_pll_clock_clk      (clk40       ), //must use pll_c0        .adc_pll_locked_export  (locked      ), //adc_pll_locked        .response_valid         (adc_valid   ), //adc_valid        .response_channel       (adc_chnanel ), //adc_chnanel        .response_data          (adc_data    ), //adc_data        .response_startofpacket (            ), //startofpacket        .response_endofpacket   (            ), //endofpacket        .command_valid          (1'b1        ), //command.valid        .command_channel        (5'd7        ), //set output channel        .command_startofpacket  (1'b0        ), //startofpacket        .command_endofpacket    (1'b0        ), //endofpacket        .command_ready          (   )  //ready to accept new command);endmodule       5.sinaltap抓数:
             为了观测ADC转换的效果,通过调整10M08 Evaluation Kit 左下角的R94阻值,改变ADC的7通道输入电压,用万用表测量对应的FPGA IO输入电压为1.774V,转换结果显示为12‘d2176。
             
             参考电压为3.3V,当输入电压为1.774V时,对应ADC值应为(4096*1.774/3.3)-1=2200,与ADC转换值相差24.........我一点也不郁闷,毕竟我那万用表精度有限,另外PCB布线也不是特别讲究,况且板上的3.3V与数字电路混用抖动较大。总的来说结果还是比较准确的。
    三、个人感受
            1.在ADC的IP核中选择需要用到的ADC通道,综合后FPGA将把对应IO自动设置为模拟输入,不需要用户添加管脚约束。
            2.ADC单通道可以达到1M,多通道只能共享一个转换器,所以当开启多个通道时,上述代码用户需要根据command_ready状态,下发通道切换命令(command_channel)来控制转换器对哪个通道的模拟输入进行转换。
        3.即使IP核为Qsys内的IP,依然可以hdl直接例化,不一定非要上nios。即便是avalone接口,依然可以通过hdl来控制。哪怕用了Qsys的模块间连线功能,我们依旧可以将需要引出的信号设置为IO拉出Qsys。
    后续将继续测评User Flash和DSP……
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-5-26 00:30 , Processed in 0.111152 second(s), 18 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.