LVDS(Low-Voltage Differential Signaling)低電壓差分信號,,是一種低功耗、低誤碼率、低串?dāng)_和低輻射的差分信號技術(shù),。 逐次逼近型ADC由比較器包括n位逐次比較型AD轉(zhuǎn)換器,它由控制邏輯電路,、時序產(chǎn)生器,、移位寄存器、DA轉(zhuǎn)換器及電壓比較器組成,。 舉例如下:電路為8位AD轉(zhuǎn)換器,輸入模擬量vA=6.84v,,DA轉(zhuǎn)換器基準(zhǔn)電壓VREF=10v,。當(dāng)啟動脈沖低電平到來后轉(zhuǎn)換開始,在第一個CP作用下,,數(shù)據(jù)寄存器將D7~D0=10000000送入D/A轉(zhuǎn)換器,,其輸出電壓v0=5V,vA與v0比較,,vA>v0存1,;第二個CP到來時,寄存器輸出D7~D0=11000000,,v0為7.5V,,vA再與7.5V比較,因vA<7.5V,,所以D6存0,;輸入第三個CP時,D7~D0=10100000,,v0=6.25V,;vA再與v0比較,……如此重復(fù)比較下去,,經(jīng)8個時鐘周期,,轉(zhuǎn)換結(jié)束。由圖中v0的波形可見,,在逐次比較過程中,,與輸出數(shù)字量對應(yīng)的模擬電壓v0逐漸逼近vA值,最后得到A/D轉(zhuǎn)換器轉(zhuǎn)換結(jié)果D7~D0為10101111,。該數(shù)字量所對應(yīng)的模擬電壓為6.8359375V,,與實(shí)際輸入的模擬電壓6.84V 的相對誤差僅為 0.06% 本實(shí)驗(yàn)是打算采用AD7928這個數(shù)據(jù)采集設(shè)備,這是一個12位高速,、低功耗,、8通道逐次逼近型ADC,。采用單電源工作,電源電壓為2.7v~5.25v,,最高吞吐速率可以達(dá)到1Msps,。內(nèi)置有低噪聲、款帶寬采樣保持放大器,,可以處理8Mhz以上的輸入頻率,。 通過配置控制寄存器,器件的模擬輸入范圍可以在0v到REFin或0v到2REFin間選擇,,可采用標(biāo)準(zhǔn)二進(jìn)制或者二進(jìn)制補(bǔ)碼輸出編碼,。AD7928具有八個通道序列器的單端模擬輸入,可以通過預(yù)先編程選擇通道轉(zhuǎn)換順序,。
時序規(guī)格
通過閱讀手冊第20頁,發(fā)現(xiàn)有三種方式可以解決上述的問題,。 目前存在的問題是,,這只是8通道的AD采集,但是實(shí)驗(yàn)需要用到32個通道,,怎么去用這一個AD采集模塊去完成4次8通道AD采集,??,? 同時使用8個通道只需要對控制寄存器的參數(shù)進(jìn)行輸入配置,,即可讓8個通道循環(huán)使用。
我想想該怎么加控制,? 這個代碼是單純的啟動AD7928八個通道連續(xù)循環(huán)采集數(shù)據(jù),。 module ad7928_ctrl32(input clk,input rst_n,//spiinput adc_dout,output reg adc_cs,output reg adc_sclk,output reg adc_din,//othersoutput reg dout_vld, //每個轉(zhuǎn)換結(jié)束輸出一個標(biāo)志位output [2:0] adc_sel, //控制8選1output reg [18:0] dout,output reg ad_change_flag //每組(即32個PD)結(jié)束之后輸出一個標(biāo)志位);parameter WRITE = 1'b1;parameter PM = 2'b11;parameter SEQ =1'b0;parameter SHADOW = 1'b0;parameter RANGE = 1'b0;parameter CODING = 1'b1;//先設(shè)計一個時鐘頻率為1Mhz的,,那么周期就是1000nsreg [5:0] cnt0;wire add_cnt0 = 1'b1;wire end_cnt0 = add_cnt0 && cnt0==6'd49;always @ (posedge clk or negedge rst_n) beginif(!rst_n) begincnt0 <= 6'd0;endelse if(add_cnt0) beginif(end_cnt0) begincnt0 <= 6'd0;endelse begincnt0 <= cnt0 + 1'b1;endendend//每次采集16位數(shù)據(jù),并且cs的上升沿與下降沿之間最少50nsreg [4:0] cnt1;wire add_cnt1 = end_cnt0;wire end_cnt1 = add_cnt1 && cnt1==5'd17;always @ (posedge clk or negedge rst_n) beginif(!rst_n) begincnt1 <= 5'b0;endelse if(add_cnt1) beginif(end_cnt1) begincnt1 <= 5'b0;endelse begincnt1 <= cnt1 + 1'b1;endendend//切換四個通道reg [2:0] cnt2;wire add_cnt2 = end_cnt1;wire end_cnt2 = add_cnt2 && cnt2 == 3'd3;always @ (posedge clk or negedge rst_n) beginif(!rst_n) begincnt2 <= 3'b0;endelse if(add_cnt2) beginif(end_cnt2) begincnt2 <= 3'b0;endelse begincnt2 <= cnt2 + 1'b1;endendend//切換那4個8選1通道reg [2:0] cnt3;wire add_cnt3 = end_cnt2;wire end_cnt3 = add_cnt3 && cnt3 == 3'd7;always @ (posedge clk or negedge rst_n) beginif(!rst_n) begincnt3 <= 3'b0;endelse if(add_cnt3) beginif(end_cnt3) begincnt3 <= 3'b0;endelse begincnt3 <= cnt3 + 1'b1;endendend//產(chǎn)生adc_csalways @ (posedge clk or negedge rst_n) beginif(!rst_n) beginadc_cs <= 1'b1;endelse if(add_cnt0 && cnt0==6'd24 && cnt1==5'd0) beginadc_cs <= 1'b0;endelse if(add_cnt0 && cnt0==6'd24 && cnt1==5'd17) beginadc_cs <= 1'b1;endend//產(chǎn)生adc_sclkalways @ (posedge clk or negedge rst_n) beginif(!rst_n) beginadc_sclk <= 1'b1;endelse if(add_cnt0 && cnt0==6'd24 && cnt1>=5'd1 && cnt1<5'd17) beginadc_sclk <= 1'b0;endelse if(end_cnt0) beginadc_sclk <= 1'b1;endend//給ADC7928輸入控制寄存器wire [15:0] data;assign data = {WRITE,SEQ,1'b0,cnt2,PM,SHADOW,1'b0,RANGE,CODING,4'b0};always @ (posedge clk or negedge rst_n) beginif(!rst_n) beginadc_din <= 0;endelse if(end_cnt0 && cnt1<16) beginadc_din <= data[15-cnt1];endend//輸出ADC7928的16位數(shù)據(jù)reg [15:0] tmp_dout;always @ (posedge clk or negedge rst_n) beginif(!rst_n) begintmp_dout <= 16'd0;endelse if(add_cnt0 && cnt0==6'd24 && cnt1>=1 && cnt1 <17) begintmp_dout[16-cnt1] <= adc_dout;endendalways @ (posedge clk or negedge rst_n) beginif(!rst_n) begindout <= 19'd0;endelse if(cnt1==5'd16)begindout <= {cnt3,tmp_dout};endendalways @ (posedge clk or negedge rst_n) beginif(!rst_n) beginad_change_flag <= 1'b0;endelse if(cnt1==5'd16 && end_cnt3) beginad_change_flag <= 1'b1;endelse beginad_change_flag <= 1'b0;endendalways @ (posedge clk or negedge rst_n) beginif(!rst_n) begindout_vld <= 1'b0;endelse if(add_cnt0 && cnt0==6'd25 && cnt1==5'd16)begindout_vld <= 1'b1;endelse if(add_cnt0 && cnt0==6'd24 && cnt1==5'd16) begindout_vld <= 1'b0;endendassign adc_sel = cnt3;endmodule
這個代碼仿真過了,,沒錯,,具體還得下板子 |
|
來自: 火龍ocnunr7cj9 > 《電子》