0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

FPGA上可以用一个比较器实现ADC的功能?2

jf_78858299 来源:硬禾学堂 作者:苏老师 2023-04-25 11:19 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

数字低通滤波器模块,做平滑滤波

//*********************************************************************
//
//  'Box' Average 
//
//  Standard Mean Average Calculation
//   Can be modeled as FIR Low-Pass Filter where 
//   all coefficients are equal to '1'.
//
//*********************************************************************


module box_ave (
  clk,
  rstn,
  sample,
  raw_data_in,
  ave_data_out,
    data_out_valid);


parameter 
ADC_WIDTH = 8,        // ADC Convertor Bit Precision
LPF_DEPTH_BITS = 4;         // 2^LPF_DEPTH_BITS is decimation rate of averager


//input ports
input  clk;                                // sample rate clock
input  rstn;                              // async reset, asserted low
input  sample;                        // raw_data_in is good on rising edge, 
input  [ADC_WIDTH-1:0]  raw_data_in;    // raw_data input


//output ports
output [ADC_WIDTH-1:0]  ave_data_out;    // ave data output
output data_out_valid;                      // ave_data_out is valid, single pulse


reg [ADC_WIDTH-1:0]  ave_data_out;    
//**********************************************************************
//
//  Internal Wire & Reg Signals
//
//**********************************************************************
reg [ADC_WIDTH+LPF_DEPTH_BITS-1:0]      accum;          // accumulator
reg [LPF_DEPTH_BITS-1:0]                count;          // decimation count
reg [ADC_WIDTH-1:0]            raw_data_d1;    // pipeline register


reg sample_d1, sample_d2;                               // pipeline registers
reg result_valid;                                       // accumulator result 'valid'
wire accumulate;                                        // sample rising edge detected
wire latch_result;                                      // latch accumulator result


//***********************************************************************
//
//  Rising Edge Detection and data alignment pipelines
//
//***********************************************************************
always @(posedge clk or negedge rstn)
begin
  if( ~rstn ) begin
    sample_d1 <= 0;  
    sample_d2 <= 0;
        raw_data_d1 <= 0;
    result_valid <= 0;
  end else begin
    sample_d1 <= sample;                // capture 'sample' input
    sample_d2 <= sample_d1;             // delay for edge detection
    raw_data_d1 <= raw_data_in;       // pipeline 
    result_valid <= latch_result;    // pipeline for alignment with result
  end
end


assign    accumulate = sample_d1 && !sample_d2;      // 'sample' rising_edge detect
assign    latch_result = accumulate && (count == 0);  // latch accum. per decimation count


//***********************************************************************
//
//  Accumulator Depth counter
//
//***********************************************************************
always @(posedge clk or negedge rstn)
begin
  if( ~rstn ) begin
    count <= 0;    
  end else begin
      if (accumulate)  count <= count + 1;         // incr. count per each sample
  end
end




//***********************************************************************
//
//  Accumulator
//
//***********************************************************************
always @(posedge clk or negedge rstn)
begin
  if( ~rstn ) begin
    accum <= 0;  
  end else begin
        if (accumulate)
            if(count == 0)                      // reset accumulator
            accum <= raw_data_d1;           // prime with first value
            else
                accum <= accum + raw_data_d1;   // accumulate
  end  
end

//***********************************************************************
//
//  Latch Result
//
//  ave = (summation of 'n' samples)/'n'  is right shift when 'n' is power of two
//
//***********************************************************************
always @(posedge clk or negedge rstn)
begin
  if( ~rstn ) begin
        ave_data_out <= 0;
    end else if (latch_result) begin            // at end of decimation period...
        ave_data_out <= accum >> LPF_DEPTH_BITS;    // ... save accumulator/n result
    end
end


assign data_out_valid = result_valid;       // output assignment


endmodule

FPGA的小朋友不妨可以试一下,只需要搭配一颗比较器、一个电阻R、一个电容C,只需要FPGA的两根管脚,你就可以拥有ADC的功能了。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1655

    文章

    22282

    浏览量

    630093
  • 芯片
    +关注

    关注

    462

    文章

    53530

    浏览量

    458880
  • adc
    adc
    +关注

    关注

    100

    文章

    7380

    浏览量

    553695
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    fpga开发板使用教程之在K7Ibert实现基本的GTX测试

    测试,而且基本可以达到不用敲代码就可以完成测试的目的。 下面按步骤,实现。重点的地方我
    发表于 12-31 15:36 9144次阅读

    ADC实现IO挂多个按键

    有时候做设计时,我们会遇到外部按键比较多,IO口不够用的情况。这时大部分人会考虑通过其它芯片扩展IO,或者直接换一个IO口足够的MCU。其实,还有方法可以
    发表于 09-01 13:25 3691次阅读

    如何用STM32F407实现可编程的模拟比较功能

    STM32F407没有独立的模拟比较端口,如何能实现可编程的模拟比较
    发表于 11-28 14:00

    STM32F303VCT6比较只有三可以用

    STM32F303VCT6共有7比较,为何只有COMP1、COMP2、COMP7这三可以用
    发表于 02-13 07:13

    基于Ginkgo 2ADC实现虚拟示波器功能

    模块,调用ADC_Init()函数即可,详细调用方法请参考程序源码。2、开定时实现定时读取
    发表于 02-21 11:38

    怎么利用FPGA和CPLD数字逻辑实现ADC

    数字系统的设计人员擅长在其印制电路板FPGA和CPLD将各种处理、存储和标准的功能元件粘
    发表于 08-19 06:15

    如何利用FPGA实现高频率ADC

    数字系统的设计人员擅长在其印制电路板FPGA和CPLD将各种处理、存储和标准的功能元件粘
    发表于 09-19 06:18

    可以用FPGA做些什么

    我刚买了新的NEXYS4 DDR板,我已经安装并使用了Vivado套件。我的问题是我可以用FPGA做些什么?我是名计算机/电气学生,我之所以采用这种逻辑与实验课是因为我已经参加了我学校提供的常规
    发表于 05-05 07:28

    可以用STM32实现什么?为什么使用STM32而不是8051

    你问,如何系统地入门学习STM32?本身就是错误的问题。假如你会使用8051 , 会写C语言,那么STM32本身并不需要刻意的学习。你要考虑的是, 我可以用STM32实现
    发表于 02-25 06:43

    matlab来实现fpga功能的设计

    matlab来实现fpga功能的设计 摘要:System Generator for DSP是Xilinx公司开发的基于Matlab的DSP开发工具?熗?时也是
    发表于 01-16 18:10 1.2w次阅读
    <b class='flag-5'>用</b>matlab来<b class='flag-5'>实现</b><b class='flag-5'>fpga</b><b class='flag-5'>功能</b>的设计

    基于FPGA和CPLD数字逻辑实现ADC技术

    基于FPGA和CPLD数字逻辑实现ADC技术 数字系统的设计人员擅长在其印制电路板FPGA
    发表于 05-25 09:39 1810次阅读
    基于<b class='flag-5'>FPGA</b>和CPLD数字逻辑<b class='flag-5'>实现</b><b class='flag-5'>ADC</b>技术

    基于fpga和cpld低频/最小逻辑ADC实现

    数字系统的设计人员擅长在其印制电路板FPGA和CPLD将各种处理、存储和标准的功能元件粘
    发表于 04-26 11:53 1732次阅读
    基于<b class='flag-5'>fpga</b>和cpld低频/最小逻辑<b class='flag-5'>ADC</b><b class='flag-5'>实现</b>

    编写可以用GRUB来引导的简单x86内核

    我们将从零开始,动手编写可以用GRUB来引导的简单x86内核,该内核会在屏幕打印条信息,然后——挂起!
    的头像 发表于 01-21 09:12 8205次阅读

    如何制作简易的Sigma Delta ADC

    本文为备战电赛的案例之,涉及到的知识技能: FPGA的使用 ADC的原理及构成 PWM的产生 比较的应用 数字滤波
    的头像 发表于 04-01 10:27 5689次阅读
    如何制作<b class='flag-5'>一</b><b class='flag-5'>个</b>简易的Sigma Delta <b class='flag-5'>ADC</b>?

    FPGA可以用比较实现ADC功能?1

    多数FPGA芯片没有ADC功能,而些应用则需要用到ADC
    的头像 发表于 04-25 11:18 5320次阅读
    <b class='flag-5'>FPGA</b><b class='flag-5'>上</b><b class='flag-5'>可以用</b><b class='flag-5'>一</b><b class='flag-5'>个</b><b class='flag-5'>比较</b><b class='flag-5'>器</b><b class='flag-5'>实现</b><b class='flag-5'>ADC</b>的<b class='flag-5'>功能</b>?1