計(jì):碼型轉(zhuǎn)換、峰峰值與最后一個(gè)樣本的自檢實(shí)驗(yàn))
ADC 采樣數(shù)據(jù)到達(dá) FPGA 后常需要每收到 N 個(gè)樣本就報(bào)告一次最小值、最大值、峰峰值以及端點(diǎn)碼出現(xiàn)次數(shù)。這里的難點(diǎn)并不在比較器本身offset binary 不能直接當(dāng)二補(bǔ)碼比較最后一個(gè)樣本不能漏算下游停頓時(shí)也不能把結(jié)果覆蓋。本文實(shí)現(xiàn)一個(gè)獨(dú)立的數(shù)字統(tǒng)計(jì)核心統(tǒng)計(jì)窗口由N 次實(shí)際輸入握手定義。氣泡和背壓會(huì)改變窗口持續(xù)時(shí)間所以它不是固定時(shí)間長(zhǎng)度的測(cè)量窗也不是 ADC 引腳接收器。先給真實(shí)環(huán)境、執(zhí)行命令和結(jié)果2026-10-24在實(shí)際核實(shí)的DESKTOP-396TDVB上使用已安裝的 Vivado Simulator2022.1SW Build3526262、IP Build3524634。時(shí)鐘周期為 TB 設(shè)置的 10 ns不是目標(biāo)板已驗(yàn)證的工作頻率。本次只做 RTL 仿真綜合、STA、上板均未執(zhí)行。主自檢的 12 個(gè)參數(shù)實(shí)例全部通過(guò)獨(dú)立 reviewer 的 20 個(gè)實(shí)例也通過(guò)。主測(cè)試實(shí)際接受 5948 個(gè)樣本消費(fèi) 2212 個(gè)窗口這些窗口對(duì)應(yīng) 5876 個(gè)樣本其余 72 個(gè)樣本因復(fù)位丟棄。獨(dú)立測(cè)試接受 22211 個(gè)樣本消費(fèi) 6162 個(gè)窗口另有 170 個(gè)復(fù)位丟棄樣本。獨(dú)立小位寬窮舉的2812 個(gè)不同窗口都實(shí)際被消費(fèi)不是僅生成了輸入向量。TEST_PASS ADC_MAIN instances12 TEST_PASS ADC_REVIEW cases20 all_small_width_tuples_consumed正常測(cè)試的 xvlog、xelab、xsim 退出碼均為 0且日志無(wú) Fatal/ERROR。四個(gè)有意錯(cuò)誤變體都成功編譯、展開(kāi)后觸發(fā)功能斷言后文說(shuō)明它們各自暴露的問(wèn)題。結(jié)論來(lái)自當(dāng)天新日志不復(fù)用舊實(shí)驗(yàn)成績(jī)。先創(chuàng)建src子目錄將后文兩個(gè)完整代碼塊保存為src/adc_window_stats.sv、src/tb_adc_window_stats.sv然后在包含src子目錄的項(xiàng)目根目錄打開(kāi) PowerShell。以下命令不需要 Python 或私人 ZIP使用已經(jīng)安裝的 Vivado。只需按自己的安裝位置修改$vivadoBin新輸出目錄不可已存在。$vivadoBinD:\tools\Xilinx\Vivado\2022.1\binNew-Item-ItemType Directory-Pathmanual_adc_window_stats-ErrorAction StopSet-Locationmanual_adc_window_stats$vivadoBin\xvlog.bat--sv../src/adc_window_stats.sv../src/tb_adc_window_stats.svif($LASTEXITCODE-ne0){throwxvlog failed}$vivadoBin\xelab.battb_adc_window_stats-s sim-debug typicalif($LASTEXITCODE-ne0){throwxelab failed} open_vcd trace.vcd log_vcd /tb_adc_window_stats/* run 4000 ns close_vcd run all quit |Set-Content-Encoding asciisimulate.tcl$vivadoBin\xsim.batsim-tclbatch simulate.tclif($LASTEXITCODE-ne0){throwxsim process failed}$simTextGet-Content-LiteralPathxsim.log-Rawif($simText-notmatchTEST_PASS-or$simText-matchFatal:|ERROR:){throwRTL self-check failed}Set-Location..本次自動(dòng)運(yùn)行同樣執(zhí)行這三種工具及對(duì)應(yīng)選項(xiàng)并把完整 argv、UTC 開(kāi)始/結(jié)束時(shí)間、退出碼、編譯源文件副本和 SHA256 留存。xsim.log、console 日志、CSV、trace.vcd與sim.wdb都有保存VCD 只記錄前 4000 ns隨后run all完成剩余測(cè)試CSV 覆蓋全程。不能把局部 VCD 說(shuō)成全部用例的波形。1. 先把碼型變成同一種有符號(hào)整數(shù)參數(shù)W1輸入原始位串in_code[W-1:0]。OFFSET_BINARY是編譯參數(shù)不能在一個(gè)窗口內(nèi)動(dòng)態(tài)切換OFFSET_BINARY1x unsigned(in_code) - 2^(W-1) OFFSET_BINARY0按 W 位二補(bǔ)碼解釋 in_code L -2^(W-1), H 2^(W-1)-1offset binary 與二補(bǔ)碼的位串轉(zhuǎn)換只需翻轉(zhuǎn) MSB。這個(gè)編碼關(guān)系可在 ADI《Fundamentals of Sampled Data Systems》第 2 章、印刷頁(yè) 2.9 的 編碼章節(jié) 核對(duì)本文于 2026-10-24 實(shí)際訪問(wèn)。這里使用的是整數(shù)碼單位實(shí)際電壓換算仍取決于轉(zhuǎn)換器量程、參考電壓和具體傳輸函數(shù)。例如 W8規(guī)范化整數(shù) xoffset binary 原碼二補(bǔ)碼原碼-1280080-17FFF08000127FF7F表中原碼為十六進(jìn)制。轉(zhuǎn)換后比較對(duì)象必須聲明為 signed不能只在輸入端做一次$signed后面卻又用無(wú)符號(hào)比較破壞順序。out_low_hits統(tǒng)計(jì)xL的次數(shù)out_high_hits統(tǒng)計(jì)xH的次數(shù)。它們不是窗口最小值/最大值的出現(xiàn)次數(shù)。比如窗口[3,3,7,7]的 min/max 是 3/7但在 W8 時(shí)兩個(gè)端點(diǎn)計(jì)數(shù)都為 0。端點(diǎn)碼可能是正常量化結(jié)果單憑這個(gè)計(jì)數(shù)不能判定模擬過(guò)載。2. 接口契約與位寬接口約定W / N正整數(shù)包括 W1、N1clk / rst上升沿工作高有效同步復(fù)位優(yōu)先級(jí)最高in_valid / in_ready / in_code邊沿前 validready 才接受樣本阻塞時(shí)上游保持 valid 和 codeout_valid / out_ready邊沿前 validready 才消費(fèi)結(jié)果out_min / out_maxW 位有符號(hào)數(shù)out_ppW 位無(wú)符號(hào)數(shù)表示 max-minout_low_hits / out_high_hitsC$clog2(N1)位可表示 0…N峰峰值最大為H-L2^W-1所以 W 位無(wú)符號(hào)足夠W 位有符號(hào)數(shù)卻只能表示到2^(W-1)-1。RTL 先將兩個(gè)極值分別符號(hào)擴(kuò)展到 W1 位再相減最后保留 W 位非負(fù)結(jié)果。例如 W16、min-32768、max32767峰峰值為 65535。計(jì)數(shù)寬度必須能裝下 N。N4 時(shí)clog2(N)2只能計(jì)到 3這里用clog2(N1)3。N1 則 C1不能產(chǎn)生零寬向量。本設(shè)計(jì)只有一個(gè)結(jié)果槽。out_valid !out_ready時(shí)結(jié)果字段穩(wěn)定in_ready0消費(fèi)舊結(jié)果的同一邊沿允許接收下一窗口首樣本。N1 時(shí)每個(gè)樣本立即形成結(jié)果同拍消費(fèi)舊結(jié)果并產(chǎn)生新結(jié)果時(shí)out_valid 可以連續(xù)為 1。輸出無(wú)效時(shí)字段保持上次值不能只看總線值判斷有新結(jié)果。同步復(fù)位丟棄部分窗口和未消費(fèi)結(jié)果清空輸出字段已經(jīng)消費(fèi)的結(jié)果不能被撤銷。雖然in_ready組合地被 rst 抑制統(tǒng)計(jì)狀態(tài)仍只在上升沿復(fù)位。3. 用真實(shí)逐拍例子檢查背壓下面取自本次 W8、N4、offset binary 的adc_w8_n4_ob1.csv。CSV 在上升沿后 1 ns 寫出輸入握手信號(hào)保存的是邊沿前值結(jié)果字段是邊沿后值。時(shí)鐘上升沿 / CSV 時(shí)刻 ns事件結(jié)果35/36、45/46、55/56、65/66連續(xù)接受四個(gè)原碼 00即四個(gè) -12865 ns 邊沿后 valid1minmax-128pp0low_hits475/76、85/86、95/96ready0下一樣本的 valid/code 保持不接收新樣本所有結(jié)果字段保持105/106消費(fèi)舊結(jié)果同時(shí)接受下一窗口首個(gè) -128消費(fèi)計(jì)數(shù)加 1新窗口已有 1 個(gè)樣本115/116、125/126、135/136接受三個(gè) 127135 ns 后 min-128、max127、pp255端點(diǎn)次數(shù) 1/3145/146消費(fèi)第二個(gè)結(jié)果窗口消費(fèi)計(jì)數(shù)為 2圖 1 按 CSV 采樣點(diǎn)畫階梯連線明確區(qū)分 pre/post 字段它不是示波器截圖也不把兩次采樣之間的線段當(dāng)作模擬電路波形。前 4000 ns 的 VCD 保存在本次運(yùn)行目錄完整測(cè)試用 CSV 核查。圖 2 展示前 10 個(gè)已消費(fèi)窗口。全低、全高窗口驗(yàn)證計(jì)數(shù)能達(dá)到 N后面的定向窗口把極值放在最后一項(xiàng)驗(yàn)證它確實(shí)被計(jì)入。圖來(lái)自實(shí)際消費(fèi)記錄不是只對(duì)預(yù)期數(shù)據(jù)作圖。4. 完整 RTL保存為src/adc_window_stats.sv。代碼塊與最終實(shí)際編譯文件逐字一致。timescale 1ns/1ps module adc_window_stats #( parameter integer W8,N4, parameter bit OFFSET_BINARY1 )( input wire clk,rst,in_valid, output wire in_ready, input wire [W-1:0] in_code, output reg out_valid, input wire out_ready, output reg signed [W-1:0] out_min,out_max, output reg [W-1:0] out_pp, output reg [$clog2(N1)-1:0] out_low_hits,out_high_hits ); localparam integer C$clog2(N1); localparam signed [W-1:0] LOW{1b1,{(W-1){1b0}}}; localparam signed [W-1:0] HIGH{1b0,{(W-1){1b1}}}; reg [C-1:0] count,low_hits,high_hits; reg signed [W-1:0] running_min,running_max; wire signed [W-1:0] sample$signed(in_code ^ (OFFSET_BINARY ? LOW : {W{1b0}})); wire signed [W-1:0] next_min(count0 || samplerunning_min)?sample:running_min; wire signed [W-1:0] next_max(count0 || samplerunning_max)?sample:running_max; wire [C-1:0] next_low(count0 ? {C{1b0}} : low_hits)(sampleLOW); wire [C-1:0] next_high(count0 ? {C{1b0}} : high_hits)(sampleHIGH); wire [W:0] span$signed({next_max[W-1],next_max})-$signed({next_min[W-1],next_min}); assign in_ready!rst (!out_valid || out_ready); always (posedge clk) begin if(rst) begin count0;low_hits0;high_hits0;running_min0;running_max0; out_valid0;out_min0;out_max0;out_pp0;out_low_hits0;out_high_hits0; end else begin if(out_valid out_ready) out_valid0; if(in_valid in_ready) begin running_minnext_min;running_maxnext_max;low_hitsnext_low;high_hitsnext_high; if(countN-1) begin count0;out_valid1; out_minnext_min;out_maxnext_max;out_ppspan[W-1:0]; out_low_hitsnext_low;out_high_hitsnext_high; end else countcount1b1; end end end endmodulenext_min/next_max/next_low/next_high已包含當(dāng)前輸入樣本第 N 個(gè)樣本到來(lái)時(shí)直接把這些 next 值鎖存到輸出。若寫成out_minrunning_min非阻塞賦值會(huì)取舊寄存器值最后一項(xiàng)就被漏掉。count0表示當(dāng)前樣本是新窗口第一項(xiàng)因此初始化極值為這個(gè)樣本而不是初始化成 0。否則全正窗口的 min 或全負(fù)窗口的 max 會(huì)被錯(cuò)誤的初值污染。5. 完整原始自檢 TB參考模型把接受的樣本存入數(shù)組窗口完成時(shí)遍歷整個(gè)數(shù)組計(jì)算極值與端點(diǎn)計(jì)數(shù)。它不讀取 DUT 內(nèi)部狀態(tài)不調(diào)用 DUT 的組合函數(shù)。每拍檢查 ready、valid、輸出數(shù)據(jù)、未知態(tài)以及樣本守恒accepted_samples delivered_windows*N discarded_samples partial_samples (pending_result ? N : 0)主 TB 的小寬度窮舉為 W1/N1、W2/N3、W3/N2兩種碼型合計(jì) 260 個(gè)窗口。隨機(jī)部分有輸入氣泡及樣本變化輸出阻塞另有明確的 3 拍定向場(chǎng)景更密集的隨機(jī)背壓由獨(dú)立 TB 覆蓋不能僅因驅(qū)動(dòng)里有隨機(jī) ready 就聲稱所有時(shí)序已覆蓋。timescale 1ns/1ps module adc_case #(parameter W3,N3,OB1)(output reg finished); localparam C$clog2(N1); reg clk0,rst1,in_valid0,out_ready0; reg [W-1:0] in_code0; wire in_ready,out_valid; wire signed [W-1:0] out_min,out_max; wire [W-1:0] out_pp; wire [C-1:0] out_low_hits,out_high_hits; adc_window_stats #(.W(W),.N(N),.OFFSET_BINARY(OB)) dut(.*); always #5 if(!finished) clk~clk; longint signed samples[0:N-1],lo,hi,emin0,emax0,x,raw_mask; longint unsigned epp0; integer elow0,ehigh0,partial0,accepted0,delivered0,discarded0; integer cycles0,stalls0,duplex0,fd,phase0,k,j,p,total,word,temporary,reset_age; reg ev0,fire,source_blocked0; reg [W-1:0] saved_source; reg [31:0] seed32h2410a5c3; function automatic [31:0] rng; begin seedseed^(seed13);seedseed^(seed17);seedseed^(seed5);rngseed;end endfunction function automatic longint signed decode(input [W-1:0] v); longint signed z; begin z$unsigned(v);decodeOB ? z-(64sd1(W-1)) : (v[W-1] ? z-(64sd1W) : z);end endfunction function automatic [W-1:0] encode(input longint signed v); begin encodeOB ? v(64sd1(W-1)) : v;end endfunction task automatic tick(input bit v,input [W-1:0] code,input bit ready,input bit reset); bit pre_ready,pre_valid; begin (negedge clk);in_validv;in_codecode;out_readyready;rstreset; (posedge clk);cycles;pre_readyin_ready;pre_validout_valid; if(in_ready ! (!reset (!ev || ready))) $fatal(1,ADC_ASSERT ready W%0d N%0d OB%0d phase%0d,W,N,OB,phase); firevpre_ready; if(reset) begin discardedpartial(ev?N:0);partial0;ev0; emin0;emax0;epp0;elow0;ehigh0;source_blocked0; end else begin if(source_blocked (!v || code!saved_source)) $fatal(1,ADC_STIMULUS_ASSERT blocked source changed); if(ev !ready) stalls; if(ev ready) begin ev0;delivered;if(fire)duplex;end if(fire) begin samples[partial]decode(code);partial;accepted; if(partialN) begin eminsamples[0];emaxsamples[0];elow0;ehigh0; for(integer a0;aN;a) begin if(samples[a]emin)eminsamples[a]; if(samples[a]emax)emaxsamples[a]; if(samples[a]lo)elow; if(samples[a]hi)ehigh; end eppemax-emin;partial0;ev1; end end source_blockedv!pre_ready;saved_sourcecode; end #1; if($isunknown({out_valid,out_min,out_max,out_pp,out_low_hits,out_high_hits}) || out_valid!ev || $signed(out_min)!emin || $signed(out_max)!emax || $unsigned(out_pp)!epp || out_low_hits!elow || out_high_hits!ehigh) $fatal(1,ADC_ASSERT W%0d N%0d OB%0d phase%0d valid%b/%b min%0d/%0d max%0d/%0d pp%0d/%0d hits%0d,%0d/%0d,%0d,W,N,OB,phase,out_valid,ev,out_min,emin,out_max,emax,out_pp,epp,out_low_hits,out_high_hits,elow,ehigh); if(accepted!delivered*Ndiscardedpartial(ev?N:0)) $fatal(1,ADC_ASSERT conservation); $fdisplay(fd,%0d,%0d,%0d,%0d,%0d,%0d,%0d,%0d,%0d,%0d,%0d,%0d,%0d,%0d,%0d,%0d,%0d,%0d,%0d,%0d,%0d,%0d, $time,W,N,OB,phase,reset,v,pre_ready,$unsigned(code),pre_valid,ready,out_valid,$signed(out_min),$signed(out_max),$unsigned(out_pp),out_low_hits,out_high_hits,accepted,delivered,discarded,partial,cycles); end endtask task automatic push(input [W-1:0] code); begin fire0; while(!fire)tick(1,code,(rng()%4)!0,0); end endtask task automatic drain; begin while(ev)tick(0,0,1,0);end endtask initial begin finished0;lo-(64sd1(W-1));hi(64sd1(W-1))-1;raw_mask(64sd1W)-1; fd$fopen($sformatf(adc_w%0d_n%0d_ob%0d.csv,W,N,OB),w); $fdisplay(fd,time_ns,w,n,ob,phase,rst,in_valid,in_ready,in_code,out_valid_pre,out_ready,out_valid_post,out_min,out_max,out_pp,low_hits,high_hits,accepted,delivered,discarded,partial,cycles); tick(0,0,0,1);tick(0,0,1,0); phase1; for(p0;p5;p) begin for(k0;kN;k) begin case(p) 0:xlo;1:xhi;2:x(kN-1)?hi:0; 3:x(kN-1)?lo:0;default:x(k%2)?hi:lo; endcase push(encode(x)); end repeat(3)tick(1,encode(lo),0,0); tick(1,encode(lo),1,0); for(k1;kN;k)push(encode(hi)); drain(); end phase2; if(W*N9) begin total1(W*N); for(word0;wordtotal;word) begin temporaryword; for(k0;kN;k) begin if((wordk)%30)tick(0,rng(),1,0); push(temporary raw_mask);temporarytemporaryW; end drain(); end end phase3; for(j0;j150;j) begin for(k0;kN;k) begin if(rng()%30)tick(0,rng(),1,0); push(rng()); end drain(); end phase4; for(reset_age1;reset_ageN;reset_age) begin for(k0;kreset_age;k)push(encode(k%2?hi:lo)); tick(1,encode(hi),1,1);tick(0,0,1,0); for(k0;kN;k)push(encode(hi)); drain(); end phase5;tick(0,0,1,0); if(partial || ev || accepted!delivered*Ndiscarded || stalls15 || duplex5) $fatal(1,ADC_ASSERT final coverage); $display(CASE_PASS ADC W%0d N%0d OB%0d accepted%0d delivered%0d discarded%0d stalls%0d duplex%0d cycles%0d,W,N,OB,accepted,delivered,discarded,stalls,duplex,cycles); $fclose(fd);finished1; end endmodule module tb_adc_window_stats; wire [11:0] done; adc_case #(1,1,0) a0(done[0]);adc_case #(1,1,1) a1(done[1]); adc_case #(2,3,0) a2(done[2]);adc_case #(2,3,1) a3(done[3]); adc_case #(3,2,0) a4(done[4]);adc_case #(3,2,1) a5(done[5]); adc_case #(8,4,0) a6(done[6]);adc_case #(8,4,1) a7(done[7]); adc_case #(16,5,0) a8(done[8]);adc_case #(16,5,1) a9(done[9]); adc_case #(16,1,0) a10(done[10]);adc_case #(16,1,1) a11(done[11]); initial begin wait(done);$display(TEST_PASS ADC_MAIN instances12);$finish;end initial begin #1000000;$fatal(1,ADC_WATCHDOG);end endmodule主測(cè)試各實(shí)例實(shí)測(cè)計(jì)數(shù)如下表由最終 CSV 重放結(jié)果生成WNoffset binary周期接受樣本消費(fèi)窗口丟棄樣本窮舉消費(fèi)窗口1103941641631211139416416312230114668722766423111466872276643208474552263643218474552263648401049666164100841104966616410016103891621611016113891621611016501275840165150165112758401651506. 獨(dú)立復(fù)核與故意錯(cuò)誤獨(dú)立 reviewer 在編寫自己的 TB 時(shí)只讀接口契約尚未讀取主 RTL/TB完成后再審代碼。其整數(shù)參考和驅(qū)動(dòng)單獨(dú)編寫覆蓋 W1/W2、N1/3/4/5、兩種碼型的全部輸入元組另測(cè) W8/N5、W16/N3。每個(gè)窮舉窗口必須看到真實(shí)輸出握手才算完成一項(xiàng)。WNoffset binary周期接受樣本消費(fèi)窗口丟棄樣本窮舉消費(fèi)窗口1106353633621211163534734612130695474156681316954591516814076452212810161417635621381016150901685134153215189867513215322106383703691421163735235114230917645213664231919639211664240196215023731025624119641490370102562506851562511221510242516852562511221510248507064959615085170649095150163066145014860163166244114560獨(dú)立運(yùn)行共 29461 個(gè)實(shí)例觀察邊沿記錄 1649 個(gè)結(jié)果阻塞邊沿、2568 次同時(shí)輸入/輸出握手其中 N1 替換結(jié)果 1126 次600 周期隨機(jī)流在每個(gè)實(shí)例都執(zhí)行實(shí)際隨機(jī)氣泡 2648 次、隨機(jī)輸入受阻 1275 次。輸入受阻指 in_valid!in_ready不能與 out_valid!out_ready 的結(jié)果阻塞計(jì)數(shù)混用。每個(gè)部分窗口長(zhǎng)度和 pending 結(jié)果狀態(tài)都執(zhí)行復(fù)位并核實(shí)丟棄計(jì)數(shù)。以上統(tǒng)計(jì)不是功能覆蓋率百分比也不是器件性能指標(biāo)。四個(gè)變體均從最終正常 RTL 單點(diǎn)修改保持接口和測(cè)試不變故意錯(cuò)誤首個(gè)實(shí)際失敗兩種碼型轉(zhuǎn)換條件反轉(zhuǎn)W2/N1 的最低碼被解成 0預(yù)期 -2端點(diǎn)計(jì)數(shù)也錯(cuò)誤min 比較改成 unsignedW16/N3 最后一個(gè) -32768 沒(méi)有成為最小值pp 錯(cuò)成 0預(yù)期 65535輸出鎖存舊 running_min/maxW2/N1 第一個(gè)樣本就漏算極值仍為舊 0無(wú)視 out_ready 清 out_valid阻塞期間 valid 消失且錯(cuò)誤重新打開(kāi)輸入 ready這四項(xiàng)都由ADC_REVIEW_ASSERT觸發(fā)功能 Fatal不是編譯或展開(kāi)失敗。XSim 在這些故障運(yùn)行中返回進(jìn)程碼 0所以必須檢查斷言和通過(guò)標(biāo)識(shí)。一個(gè)變體可能打印多個(gè)同一時(shí)刻的失敗仍只計(jì)一個(gè)被捕獲變體不能累計(jì)成多輪測(cè)試。測(cè)試先行階段還保留過(guò)一次真實(shí)工具問(wèn)題未實(shí)現(xiàn)占位模塊缺少 timescalexelab 拒絕展開(kāi)另將 TB 的端口初始化移入 initial 塊消除了編譯警告。修正后主 TB 對(duì)未實(shí)現(xiàn)核心實(shí)際觸發(fā)功能斷言。該起點(diǎn)不是正常 RTL也沒(méi)有被算進(jìn)四個(gè)最終負(fù)例。正常 RTL 在本次范圍內(nèi)未發(fā)現(xiàn)功能缺陷。7. 集成時(shí)必須守住的邊界這里的背壓只對(duì)可暫停的數(shù)字上游成立。真實(shí)連續(xù)采樣 ADC 往往不會(huì)因?yàn)閕n_ready0就暫停物理采樣必須在前面接緩存、記錄丟樣或者證明系統(tǒng)吞吐和最大停頓預(yù)算。若采樣已經(jīng)丟失統(tǒng)計(jì)結(jié)果也只描述實(shí)際接受的 N 個(gè)樣本不能冒充連續(xù)時(shí)域窗口。本模塊沒(méi)有測(cè)量模擬電壓、噪聲或失真也不能憑端點(diǎn)碼計(jì)數(shù)保證發(fā)現(xiàn)削頂。碼型、對(duì)齊、有效位寬和采樣接口仍需核對(duì)具體 ADC 數(shù)據(jù)手冊(cè)。本文不綁定特定轉(zhuǎn)換器不包含廠商 IP也沒(méi)有宣稱綜合或上板通過(guò)。繼續(xù)閱讀FPGA 位寬與符號(hào)擴(kuò)展。一個(gè)可直接用于設(shè)計(jì)評(píng)審的問(wèn)題是若 ADC 每拍都產(chǎn)生數(shù)據(jù)而下游最長(zhǎng)會(huì)停頓 20 拍你的前級(jí)緩存深度和丟樣計(jì)數(shù)應(yīng)如何確定才能讓每個(gè)統(tǒng)計(jì)窗口的樣本來(lái)源可追蹤