日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > > ZYNQ


概述

ADC和DAC是FPGA與外部信號的接口,從數據接口類型的角度劃分,有低速的串行接口和高速的并行接口。FPGA經常用來采集中高頻信號,因此使用并行ADC和DAC居多。本文將介紹如何使用FPGA驅動并行ADC和并行DAC芯片。

并行接口包括兩種數字編碼方式:帶符號數signed與無符號數unsigned。本文還將介紹使用不同編碼方式的ADC與DAC時需要注意的問題。

接口協(xié)議

以ADI公司的32M、8位ADC芯片AD9280和125M、8位DAC芯片AD9708為例(這是淘寶上最容易買到的AD/DA模塊)。

AD9280的時序圖如下:

AD9708的時序圖如下:

由時序圖可知,AD9280在每個輸入clock的上升沿對輸入的模擬信號做一次采集,采集數據由數據總線data輸出;AD9708也是在每個輸入clock的上升沿讀取數據總線DB0-DB7上的數據,將其轉換為相應的電流IOUTA/IOUTB輸出。

這兩個芯片的管腳雖然很多,但大多數都是與硬件設計有關。其實幾乎所有的并行ADC和并行DAC與FPGA之間的接口只有一條時鐘線與一組數據總線,數據總線的位寬即為ADC/DAC的位數。每個時鐘周期ADC都會完成一次采集(DAC完成一次輸出),因此時鐘頻率也就是ADC和DAC的采樣頻率。

FPGA設計

并行ADC和DAC的接口時序驅動非常簡單,只要利用Quartus或Vivado自帶的時鐘管理IP核生成預期采樣頻率的時鐘信號,驅動時鐘線,從數據總線上讀出或寫入數據即可。

比如下面的代碼實現了將ADC采集到的數據再通過DAC輸出:

`timescale 1ns / 1ps

//-----------------------------------------------

// 將ADC采集到的數據通過DAC輸出

//-----------------------------------------------

module adda_test

(

    input clk, 

    output daclk,

    output [7:0] dadata,       //DA data

    output adclk,

    input [7:0] addata        //AD data

);

PLL PLL_inst

(

    .clk_in1(clk),         // IN

    // Clock out ports

    .clk_out1(adclk),     // OUT 32Mhz

    .clk_out2(daclk),     // OUT 32Mhz

    // Status and control signals

    .reset(1'b0),          // IN

    .locked()

);      

assign dadata = addata;  

endmodule 

上述代碼中實例化了一個PLL IP核產生ADC和DAC所需頻率的時鐘,Quartus中該IP核叫做“PLL”,Vivado中該IP核叫做“Clocking Wizard”。

為了保證DAC輸出與ADC采集到的信號相同,將兩者時鐘頻率設置相同,且連接二者的數據總線。上述代碼可以使用開發(fā)板和AD/DA模塊進行實際測試。

編碼方式問題

上文用到的AD9280和AD9708都是無符號數編碼,而我們知道無論是Vivado還是Quartus中大多數的IP核采用的都是帶符號數二進制補碼的編碼方式(二進制原碼、補碼;有符號數、無符號數的問題可參考https://blog.csdn.net/fpgadesigner/article/details/80512067 ),這就導致ADC/DAC的數據總線不能與IP核接口直接對接,必須做一定的轉換處理。

考慮到上述數字系統(tǒng)的特點,市場上也存在不少以帶符號數二進制補碼接口的ADC/DAC,比如65M、12位ADC芯片AD9226。如果使用這種編碼方式的芯片,數據總線就可以直接與IP核接口對接,不需要做特殊處理。

但是,我們總會不可避免的遇到類似這樣的情況:

  1. ADC或DAC是無符號數編碼,而設計中需要使用一些帶符號數接口的IP核;

  2. ADC是帶符號數編碼,而設計中僅需獲取測量值,并不需要與其它帶符號數接口的模塊對接。

當遇到情況1時,需要進行無符號數編碼與帶符號數編碼之間的轉換。將ADC采集到的8位無符號數轉換為帶符號數補碼形式的代碼如下:

/**** 將addata轉化為帶符號二進制補碼形式 ****/

    reg [7:0] ad_data;

    always @ (posedge clk or negedge rst_n) if (!rst_n)  ad_data <= 8'd0;

        else ad_data <= addata - 128; //AD9280采集輸入 將帶符號數補碼轉換為8位無符號數通過DAC輸出的代碼如下: /**** 將dadata轉化為無符號數形式 ****/ reg [7:0] da_data; always @ (posedge clk or negedge rst_n) if (!rst_n) da_data <= 8'd0; else da_data <= dadata + 128; //AD9708輸出 當遇到情況2時,需要將不易直接觀察的帶符號數補碼形式轉換為帶符號數原碼形式,使其更加直觀。代碼如下: always @(posedge ad_clk) //AD9226采集 if(ad_ch1[11]==1'b1) begin                     //如果是負電壓

        ch1_reg<=12'hfff - ad_ch1 + 1'b1;

         ch1_sig <= 45; //'-' asic碼

     end

     else begin

       ch1_reg<=ad_ch1; ch1_sig<=43; //'-' asic碼

     end 

轉換的依據是一個簡單的運算關系:“補碼的整數值”+“原碼絕對值的整數值”=2^B,B為位寬。比如帶符號數原碼1110的補碼為1010:1110取絕對值0110為6;1010為10,二者加起來為2^4=16。

上述代碼便是利用了這個運算關系。為了節(jié)省位寬,先用12’hfff減掉補碼,再加1,達到同樣的效果,得到帶符號數原碼的絕對值。根據符號位便可以知道這個原碼的正負情況。

序邏輯?;蛘吒摮绦虼a,更該算法。到這一步就是沒有辦法的辦法了。

第五:有些時候在程序中加入一些和項目不相關的代碼,也可以提高正常程序的時鐘約束余量,估計是不相關代碼擠占了一些邏輯單元,使得正常程序在布局布線的時候,選擇了其他路徑吧。這個辦法不固定,瞎貓碰死耗子的事情。

主要就是這幾種方法了,首先要選好芯片,這是最重要的,不然為了省成本,最后發(fā)現芯片速度不夠,很煩人的。

最后提一下有些網友提到FPGA發(fā)熱厲害的現象,看看你在項目中是不是將unused pin 接地了,這樣芯片會發(fā)熱,最好將unused pin 微上拉,或者設置為輸入即可。


本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯系該專欄作者,如若文章內容侵犯您的權益,請及時聯系本站刪除。
關閉