0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

FPGA上可以用一個比較器實現(xiàn)ADC的功能?1

jf_78858299 ? 來源:硬禾學(xué)堂 ? 作者:蘇老師 ? 2023-04-25 11:18 ? 次閱讀

使用的平臺:

圖片

多數(shù)FPGA芯片上沒有ADC的功能,而一些應(yīng)用則需要用到ADC對一些模擬信號,比如直流電壓等進行量化,有沒有特別簡單、低成本的實現(xiàn)方法呢?

在要求轉(zhuǎn)換速率不高的情況下,完全可以借助一顆高速比較器(成本只有幾毛錢)來實現(xiàn)對模擬信號的量化,Lattice的官網(wǎng)上一篇文章就介紹了如何制作一個簡易的Sigma Delta ADC,如果FPGA能夠提供LVDS的接口,連外部的高速比較器都可以省掉。由于我們的小腳丫FPGA核心模塊在設(shè)計的時候沒有考慮到LVDS的應(yīng)用場景,所以還是需要搭配一個高速的比較器來實現(xiàn)Lattice官網(wǎng)上推薦的簡易Sigma Delta ADC的功能。

讓小腳丫FPGA通過鎖相環(huán)PLL運行于120MHz的主時鐘(還可以更高,提速到240MHz、360MHz都應(yīng)該沒有問題),測試1KHz以內(nèi)的模擬信號是沒有問題的。

Lattice的官網(wǎng)上就可以下載到簡易Sigma Delta ADC的Verilog源代碼,可以非常方便地用在其它品牌、其它系列的FPGA上。

下面的截圖就是采用120MHz的主時鐘實現(xiàn)的對1KHz模擬信號的采樣,并通過DDS/DAC輸出,口袋儀器M2000采集并顯示的模擬信號波形。

圖片

M2000口袋儀器顯示的1KHz的波形

工作原理

詳細的工作原理介紹可以參考項目https://www.eetree.cn/project/detail/255 及項目頁面中的參考資料,在這里以幾幅圖片來示例一下。

圖片

簡易Sigma Delta ADC的工作原理

圖片

直接連接 - 被測模擬信號的幅度范圍為0-3.3V

圖片

通過電阻分壓網(wǎng)絡(luò)輸入,并在比較器+端提供參考電壓,則被采集模擬信號的電壓變化范圍可以擴展

圖片

簡易Sigma Delta ADC的性能與邏輯電路的工作頻率

圖片

在不同的FPGA平臺上消耗的邏輯資源

以下就是我們的電賽綜合訓(xùn)練板上簡易Sigma Delta ADC部分的電路連接

圖片

核心代碼:

頂層調(diào)用代碼:

wire [7:0] sd_adc_out; // sigma delta adc data output


wire sample_rdy;    // flag for adc conversion


ADC_top my_adc(.clk_in(clk_hs),.rstn(1'b1),.digital_out(sd_adc_out), .analog_cmp(comp_in),.analog_out(ad_pwm),.sample_rdy(sample_rdy));


assign dac_data = sd_adc_out;
assign dac_clk = clk_hs; //120MHz generated by PLL

Sigma Delta ADC頂層程序

//*********************************************************************
//
//  ADC Top Level Module
//
//*********************************************************************


module ADC_top (
  clk_in,
  rstn,
  digital_out,
  analog_cmp,  
  analog_out,
  sample_rdy);


parameter 
ADC_WIDTH = 8,              // ADC Convertor Bit Precision
ACCUM_BITS = 10,            // 2^ACCUM_BITS is decimation rate of accumulator
LPF_DEPTH_BITS = 3,         // 2^LPF_DEPTH_BITS is decimation rate of averager
INPUT_TOPOLOGY = 1;         // 0: DIRECT: Analog input directly connected to + input of comparitor
                            // 1: NETWORK:Analog input connected through R divider to - input of comp.


//input ports
input  clk_in;        // 62.5Mhz on Control Demo board
input  rstn;   
input  analog_cmp;      // from LVDS buffer or external comparitor


//output ports
output  analog_out;         // feedback to RC network
output  sample_rdy;
output [7:0] digital_out;   // connected to LED field on control demo bd.



//**********************************************************************
//
//  Internal Wire & Reg Signals
//
//**********************************************************************
wire              clk;
wire              analog_out_i;
wire              sample_rdy_i;
wire [ADC_WIDTH-1:0]      digital_out_i;
wire [ADC_WIDTH-1:0]      digital_out_abs;




assign clk = clk_in;


//***********************************************************************
//
//  SSD ADC using onboard LVDS buffer or external comparitor
//
//***********************************************************************
sigmadelta_adc #(
  .ADC_WIDTH(ADC_WIDTH),
  .ACCUM_BITS(ACCUM_BITS),
  .LPF_DEPTH_BITS(LPF_DEPTH_BITS)
  )
SSD_ADC(
  .clk(clk),
  .rstn(rstn),
  .analog_cmp(analog_cmp),
  .digital_out(digital_out_i),
  .analog_out(analog_out_i),
  .sample_rdy(sample_rdy_i)
  );


assign digital_out_abs = INPUT_TOPOLOGY ? ~digital_out_i : digital_out_i;  


//***********************************************************************
//
//  output assignments
//
//***********************************************************************


assign digital_out   = ~digital_out_abs;   // invert bits for LED display 
assign analog_out    =  analog_out_i;
assign sample_rdy    =  sample_rdy_i;


endmodule

Sigma Delta ADC主程序

//*********************************************************************
//
//  SSD Top Level Module
//
//*********************************************************************


module sigmadelta_adc (
  clk,                    
  rstn,                   
  digital_out,            
  analog_cmp,              
  analog_out,             
  sample_rdy);            


parameter 
ADC_WIDTH = 8,              // ADC Convertor Bit Precision
ACCUM_BITS = 10,            // 2^ACCUM_BITS is decimation rate of accumulator
LPF_DEPTH_BITS = 3;         // 2^LPF_DEPTH_BITS is decimation rate of averager


//input ports
input  clk;                            // sample rate clock
input  rstn;                           // async reset, asserted low
input  analog_cmp ;                    // input from LVDS buffer (comparitor)


//output ports
output  analog_out;                     // feedback to comparitor input RC circuit
output  sample_rdy;                     // digital_out is ready
output [ADC_WIDTH-1:0]  digital_out;    // digital output word of ADC


//**********************************************************************
//
//  Internal Wire & Reg Signals
//
//**********************************************************************
reg                         delta;          // captured comparitor output
reg [ACCUM_BITS-1:0]      sigma;          // running accumulator value
reg [ADC_WIDTH-1:0]          accum;          // latched accumulator value
reg [ACCUM_BITS-1:0]      counter;        // decimation counter for accumulator
reg              rollover;       // decimation counter terminal count
reg              accum_rdy;      // latched accumulator value 'ready' 


//***********************************************************************
//
//  SSD 'Analog' Input - PWM
//
//  External Comparator Generates High/Low Value
//
//***********************************************************************


always @ (posedge clk)
begin
    delta <= analog_cmp;        // capture comparitor output
end


assign analog_out = delta;      // feedback to comparitor LPF


//***********************************************************************
//
//  Accumulator Stage
//
//  Adds PWM positive pulses over accumulator period
//
//***********************************************************************


always @ (posedge clk or negedge rstn)
begin
  if( ~rstn ) 
    begin
    sigma       <= 0;
    accum       <= 0;
    accum_rdy   <= 0;
    end else begin
        if (rollover) begin
            // latch top ADC_WIDTH bits of sigma accumulator (drop LSBs)
            accum <= sigma[ACCUM_BITS-1:ACCUM_BITS-ADC_WIDTH];
            sigma <= delta;         // reset accumulator, prime with current delta value
        end else begin
            if (&sigma != 1'b1)         // if not saturated
                sigma <= sigma + delta; // accumulate 
        end
        accum_rdy <= rollover;     // latch 'rdy' (to align with accum)
    end
end


//***********************************************************************
//
//  Box filter Average
//
//  Acts as simple decimating Low-Pass Filter
//
//***********************************************************************


box_ave #(
    .ADC_WIDTH(ADC_WIDTH),
    .LPF_DEPTH_BITS(LPF_DEPTH_BITS))
box_ave (
    .clk(clk),
    .rstn(rstn),
    .sample(accum_rdy),
    .raw_data_in(accum),
    .ave_data_out(digital_out),
    .data_out_valid(sample_rdy)
);


//************************************************************************
//
// Sample Control - Accumulator Timing
//  
//************************************************************************


always @(posedge clk or negedge rstn)
begin
  if( ~rstn ) begin
    counter <= 0;
    rollover <= 0;
    end
  else begin
    counter <= counter + 1;       // running count
    rollover <= &counter;         // assert 'rollover' when counter is all 1's
    end
end
endmodule
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1630

    文章

    21769

    瀏覽量

    604657
  • 芯片
    +關(guān)注

    關(guān)注

    456

    文章

    51019

    瀏覽量

    425418
  • adc
    adc
    +關(guān)注

    關(guān)注

    98

    文章

    6524

    瀏覽量

    545206
收藏 人收藏

    評論

    相關(guān)推薦

    fpga開發(fā)板使用教程之在K7Ibert實現(xiàn)基本的GTX測試

    測試,而且基本可以達到不用敲代碼就可以完成測試的目的。 下面按步驟,實現(xiàn)。重點的地方我
    發(fā)表于 12-31 15:36 ?7929次閱讀

    ADC實現(xiàn)IO掛多個按鍵

    有時候做設(shè)計時,我們會遇到外部按鍵比較多,IO口不夠用的情況。這時大部分人會考慮通過其它芯片擴展IO,或者直接換一個IO口足夠的MCU。其實,還有方法可以
    發(fā)表于 09-01 13:25 ?3034次閱讀

    如何用STM32F407實現(xiàn)可編程的模擬比較功能?

    STM32F407沒有獨立的模擬比較端口,如何能實現(xiàn)可編程的模擬比較
    發(fā)表于 11-28 14:00

    STM32F303VCT6比較只有三可以用

    STM32F303VCT6共有7比較,為何只有COMP1、COMP2、COMP7這三可以用
    發(fā)表于 02-13 07:13

    怎么利用FPGA和CPLD數(shù)字邏輯實現(xiàn)ADC

    數(shù)字系統(tǒng)的設(shè)計人員擅長在其印制電路板FPGA和CPLD將各種處理、存儲和標(biāo)準(zhǔn)的功能元件粘
    發(fā)表于 08-19 06:15

    如何利用FPGA實現(xiàn)高頻率ADC?

    數(shù)字系統(tǒng)的設(shè)計人員擅長在其印制電路板FPGA和CPLD將各種處理、存儲和標(biāo)準(zhǔn)的功能元件粘
    發(fā)表于 09-19 06:18

    可以用STM32實現(xiàn)什么?為什么使用STM32而不是8051

    你問,如何系統(tǒng)地入門學(xué)習(xí)STM32?本身就是錯誤的問題。假如你會使用8051 , 會寫C語言,那么STM32本身并不需要刻意的學(xué)習(xí)。你要考慮的是, 我可以用STM32實現(xiàn)
    發(fā)表于 02-25 06:43

    matlab來實現(xiàn)fpga功能的設(shè)計

    matlab來實現(xiàn)fpga功能的設(shè)計 摘要:System Generator for DSP是Xilinx公司開發(fā)的基于Matlab的DSP開發(fā)工具?熗?時也是
    發(fā)表于 01-16 18:10 ?1.1w次閱讀
    <b class='flag-5'>用</b>matlab來<b class='flag-5'>實現(xiàn)</b><b class='flag-5'>fpga</b><b class='flag-5'>功能</b>的設(shè)計

    基于FPGA和CPLD數(shù)字邏輯實現(xiàn)ADC技術(shù)

    基于FPGA和CPLD數(shù)字邏輯實現(xiàn)ADC技術(shù) 數(shù)字系統(tǒng)的設(shè)計人員擅長在其印制電路板FPGA
    發(fā)表于 05-25 09:39 ?1456次閱讀
    基于<b class='flag-5'>FPGA</b>和CPLD數(shù)字邏輯<b class='flag-5'>實現(xiàn)</b><b class='flag-5'>ADC</b>技術(shù)

    基于fpga和cpld低頻/最小邏輯ADC實現(xiàn)

    數(shù)字系統(tǒng)的設(shè)計人員擅長在其印制電路板FPGA和CPLD將各種處理、存儲和標(biāo)準(zhǔn)的功能元件粘
    發(fā)表于 04-26 11:53 ?1400次閱讀
    基于<b class='flag-5'>fpga</b>和cpld低頻/最小邏輯<b class='flag-5'>ADC</b><b class='flag-5'>實現(xiàn)</b>

    編寫可以用GRUB來引導(dǎo)的簡單x86內(nèi)核

    我們將從零開始,動手編寫可以用GRUB來引導(dǎo)的簡單x86內(nèi)核,該內(nèi)核會在屏幕打印條信息,然后——掛起!
    的頭像 發(fā)表于 01-21 09:12 ?7658次閱讀

    如何制作簡易的Sigma Delta ADC?

    本文為備戰(zhàn)電賽的案例之,涉及到的知識技能: FPGA的使用 ADC的原理及構(gòu)成 PWM的產(chǎn)生 比較的應(yīng)用 數(shù)字濾波
    的頭像 發(fā)表于 04-01 10:27 ?4488次閱讀
    如何制作<b class='flag-5'>一</b><b class='flag-5'>個</b>簡易的Sigma Delta <b class='flag-5'>ADC</b>?

    FPGA搭配3電阻、1電容制作的1bit SDR接收機

    搭配3電阻、1電容制作的1bit SDR接收機,接上喇叭,可以收聽中、長波電臺,連ADC都沒
    的頭像 發(fā)表于 11-09 09:15 ?5268次閱讀

    FPGA可以用比較實現(xiàn)ADC功能?2

    多數(shù)FPGA芯片沒有ADC功能,而些應(yīng)用則需要用到ADC
    的頭像 發(fā)表于 04-25 11:19 ?1179次閱讀

    文看懂電感可以用大的替換小的嗎

    需要盡快更換電感。那么,電路中的電感可不可以用大電感替換小電感呢?今天我們就來討論下這個問題。 是不是可以用大電感來替換小電感,我們還是要考慮多個因素: 1、封裝大小
    的頭像 發(fā)表于 01-13 21:56 ?873次閱讀