與VGA顯示方案)
簡介這是一套以FPGA為核心的16通道邏輯分析儀完整設(shè)計工程面向數(shù)字電路、EDA及FPGA開發(fā)學習者適合課程設(shè)計、畢業(yè)設(shè)計或工程實踐參考。工程實現(xiàn)通過撥碼開關(guān)選擇采樣觸發(fā)模式并調(diào)節(jié)采樣頻率采集的邏輯電平序列經(jīng)VGA接口實時顯示可清晰觀測時序變化覆蓋從源碼編寫到上板驗證的完整流程。壓縮包共106個文件包含大量.v、.tdf等Verilog/AHDL源文件qpf/qsf工程配置文件sdc時序約束mif初始化數(shù)據(jù)以及sof/pof燒錄文件同時保留編譯報告與readme說明便于讀懂工程結(jié)構(gòu)。資源大小僅1.71MB輕量易獲取已有951人學習下載。借助該工程可掌握多通道采樣控制、VGA顯示時序生成、ROM字符庫應用等關(guān)鍵設(shè)計方法并可直接作為二次開發(fā)基礎(chǔ)。1. 邏輯分析儀這個選題為什么繞不開 FPGA調(diào)試一塊新板子上的 I2C 和 SPI 總線時最怕的不是時序不對而是連波形都看不到。示波器通道不夠邏輯分析儀得上千元串口打印又跟不上高速信號。這時候用 FPGA 自制一臺邏輯分析儀就變成一個很務實的選擇用可編程邏輯去采樣、觸發(fā)、存儲再用 VGA 把波形直接顯示在顯示器上。這套方案要解決的是一臺通道數(shù)足夠、采樣率可調(diào)、觸發(fā)方式靈活的調(diào)試工具問題。適合做這個項目的人很明確正在準備 FPGA 課程設(shè)計或者畢業(yè)設(shè)計的學生需要把采樣、觸發(fā)、存儲、顯示這一整套流程打通以及做嵌入式開發(fā)但預算有限的從業(yè)者想用一塊開發(fā)板給自己做一個順手的調(diào)試設(shè)備。它不追求和商用邏輯分析儀比參數(shù)而是把 Finest 的采樣率、存儲深度、觸發(fā)條件和 VGA 顯示之間的約束關(guān)系理清楚做一臺自己能看懂、能改、能復現(xiàn)的儀器。2. 需求分析與關(guān)鍵指標采樣率、存儲深度和觸發(fā)條件怎么互相制約2.1 先搞清楚要抓什么信號通道數(shù)與協(xié)議類型決定設(shè)計方向設(shè)計邏輯分析儀的第一步不是選芯片而是明確被測對象。如果只是調(diào)試 UART、I2C、SPI 這類低速總線8 個通道完全夠用采樣率做到 50MHz 就有充足余量。但要調(diào)試并行總線或者高速串行協(xié)議通道數(shù)和采樣率就得往上提設(shè)計的復雜度也會隨之上升。拿某高校的課程設(shè)計場景來說A 同學做的方案定在 8 通道、采樣率 10MHz 到 100MHz 可調(diào)存儲深度用 FPGA 內(nèi)部的 Block RAM 實現(xiàn)目標是把 UART 和 SPI 的協(xié)議解碼功能跑通。針對這個定位主控 FPGA 不需要選太高端的型號某主流中低端系列器件就能滿足需求片上 Block RAM 數(shù)量夠用是關(guān)鍵約束。采樣率的檔位設(shè)計也需要提前規(guī)劃。用 100MHz 的系統(tǒng)時鐘作為基準分頻出 20MHz、50MHz 和 100MHz 三檔采樣率。檔位切換直接在采樣模塊里做不采用動態(tài)重配置時鐘管理器的方式避免增加設(shè)計的復雜程度。低速信號用低采樣率可以拉長可觀測的時間窗口高速信號切到高采樣率保證能捕捉到足夠多的細節(jié)。這個設(shè)計思路在實際調(diào)試中用起來很順手——抓 I2C 的地址字節(jié)時用 50MHz 采樣率抓 SPI 的高速模式時切到 100MHz不用重新綜合。2.2 為什么顯示模塊選 VGA比 HDMI 簡單比串口直觀VGA 顯示模塊是整套方案里最直觀的交付亮點。選擇 VGA 的原因有三個時序標準公開、實現(xiàn)復雜度低、幾乎所有實驗室的顯示器都支持。640x48060Hz 的分辨率足夠顯示 8 通道的波形行場同步信號的時序參數(shù)是固定的不像 HDMI 那樣涉及 TMDS 編碼和像素打包調(diào)試難度低一個數(shù)量級。接口方面VGA 需要 5 個信號紅、綠、藍各 1 位加上行同步和場同步。FPGA 的引腳可以直接輸出 3.3V 電平的 RGB 信號通過一個簡單的電阻網(wǎng)絡轉(zhuǎn)成模擬電平后接顯示器。這里有一個容易被忽略的點VGA 的 RGB 信號在 FPGA 內(nèi)部要用寄存器同步到像素時鐘域否則畫面上會出現(xiàn)隨機的顏色噪點。某開發(fā)者在調(diào)試時遇到過波形線條時斷時續(xù)的問題最后定位到是沒有把像素數(shù)據(jù)打拍同步修完之后畫面穩(wěn)定多了。2.3 三個核心指標的約束關(guān)系采樣率、深度、觸發(fā)缺一不可邏輯分析儀的設(shè)計難點不在單個模塊而在三個指標之間的聯(lián)動關(guān)系。采樣率決定能看到多快的信號存儲深度決定能看多長時間的波形觸發(fā)條件決定波形從哪里開始顯示。它們之間是互相制約的采樣率越高同樣的存儲深度能記錄的時間越短觸發(fā)位置設(shè)置不當可能錯過關(guān)鍵的協(xié)議時序。以 100MHz 采樣率、8K 深度為例一次采樣只能記錄 80 微秒的波形。如果要抓一段完整的 I2C 讀操作通常需要幾十微秒到幾百微秒這就需要在采樣率和深度之間做權(quán)衡。一般會提供預觸發(fā)和延遲觸發(fā)兩個參數(shù)預觸發(fā)用存儲深度的四分之一保證觸發(fā)前的數(shù)據(jù)也被記錄下來。這樣在觀察異常波形時能看到異常發(fā)生之前總線上發(fā)生了什么對定位總線沖突非常有用。這些參數(shù)在頂層模塊里可以通過撥碼開關(guān)或者按鍵配置不需要重新綜合就能調(diào)整。3. 總體架構(gòu)設(shè)計采樣、觸發(fā)、存儲、顯示四個模塊怎么協(xié)作3.1 架構(gòu)總覽從引腳到屏幕的數(shù)據(jù)通路整個系統(tǒng)按數(shù)據(jù)流向拆成四個模塊各模塊職責清晰邊界明確非常適合課程設(shè)計答辯時講解。采集模塊負責對被測信號進行同步和采樣觸發(fā)模塊對采樣結(jié)果進行條件判定存儲模塊將采樣數(shù)據(jù)寫入雙口 RAM顯示模塊從 RAM 讀出數(shù)據(jù)并轉(zhuǎn)換成 VGA 時序輸出。數(shù)據(jù)通路是單向的不存在回流路徑這對于 FPGA 實現(xiàn)來說非常友好——不會出現(xiàn)組合邏輯環(huán)路時序收斂的壓力也小很多。模塊之間的接口定義是設(shè)計重點。采集模塊輸出經(jīng)過同步和采樣后的 16 位數(shù)據(jù)總線每個通道占 2 位還是 1 位需要考慮。這里采用每通道 1 位8 通道共 8 位數(shù)據(jù)總線配合 2 位通道選擇信號在顯示模塊中分時讀取。觸發(fā)模塊輸出一個單周期的觸發(fā)標志信號存儲模塊根據(jù)這個標志決定是否開始寫入以及寫入到什么位置。VGA 顯示模塊從存儲模塊的讀端口讀取數(shù)據(jù)經(jīng)過查表轉(zhuǎn)換成波形像素后送入屏幕。各模塊的時鐘由頂層統(tǒng)一分配采集和觸發(fā)用采樣時鐘存儲用系統(tǒng)時鐘VGA 用像素時鐘。3.2 跨時鐘域處理三個時鐘域之間的信號同步策略FPGA 設(shè)計的核心難點就是多時鐘域的同步。本方案中存在三個時鐘域100MHz 系統(tǒng)時鐘域、可變采樣時鐘域和 25MHz VGA 像素時鐘域。采樣時鐘根據(jù)檔位設(shè)置切換頻率和系統(tǒng)時鐘不同頻如果直接把采樣數(shù)據(jù)送進存儲模塊會產(chǎn)生亞穩(wěn)態(tài)風險。最穩(wěn)妥的做法是用兩級寄存器同步即打兩拍。采樣模塊輸出的數(shù)據(jù)先同步到系統(tǒng)時鐘域再寫入存儲 RAM。觸發(fā)標志信號同理從采樣時鐘域同步到系統(tǒng)時鐘域保證存儲模塊在安全時序下響應。這里有個容易踩坑的細節(jié)兩級同步器解決的是單比特信號的亞穩(wěn)態(tài)問題但對于多比特數(shù)據(jù)總線不能簡單用打兩拍的方式處理。正確做法是把數(shù)據(jù)先鎖存到與目標時鐘域同步的寄存器等數(shù)據(jù)穩(wěn)定后再采樣。在實現(xiàn)上利用 FIFO 的異步讀寫時鐘特性是更可靠的選擇。本設(shè)計中存儲模塊選用雙口 RAM 自帶的異步讀時鐘能力寫入端口在系統(tǒng)時鐘域下工作讀出端口在像素時鐘域下工作兩個時鐘域的交互由 RAM 的讀寫地址獨立控制避免了直接跨域傳遞數(shù)據(jù)的風險。3.3 存儲方案對比Block RAM 比外部 SDRAM 更適合課程設(shè)計面對存儲深度的選擇很多同學第一反應是使用外部 SDRAM認為容量大才夠用。但 SDRAM 的控制器設(shè)計復雜刷新邏輯和有體切換會讓開發(fā)周期明顯拉長。對于 8K 深度的存儲需求FPGA 內(nèi)部 Block RAM 完全夠用。以某中端 FPGA 為例單塊 Block RAM 大小為 18Kb配置成 8K x 8 位只需要一塊資源占用率極低還能通過級聯(lián)多塊實現(xiàn) 16K 或更大深度。選 Block RAM 還有一個明顯的好處讀寫時序是確定性的不需要等待周期這在調(diào)試階段能大幅降低排查問題的難度。用 SDRAM 的時候一旦讀時序不對波形就會隨機丟點很難分辨是存儲問題還是顯示問題。用 Block RAM 之后存儲部分基本一次跑通把調(diào)試精力集中在觸發(fā)和顯示模塊上。擴展性方面如果未來需要更大深度可以在頂層把存儲模塊替換成 DDR 控制器數(shù)據(jù)接口保持不變不影響其他模塊的設(shè)計。4. 關(guān)鍵模塊實現(xiàn)從采樣到波形上屏的完整代碼與設(shè)計說明4.1 采樣模塊等精度采樣的原理與代碼實現(xiàn)采樣模塊的職責是將外部信號同步到 FPGA 內(nèi)部時鐘域并以設(shè)定的采樣率采集數(shù)據(jù)。這里采用等精度采樣法即在采樣時鐘的上升沿對輸入信號進行捕捉。由于被測信號與采樣時鐘是異步的必須先在每個采樣通道上加兩級 D 觸發(fā)器做同步防止亞穩(wěn)態(tài)導致采樣值不穩(wěn)定。同步后的數(shù)據(jù)通過一個與門網(wǎng)絡實現(xiàn)邊沿檢測每一位輸出對應通道的當前電平狀態(tài)。module sample_module #( parameter CH_WIDTH 8, parameter SAMPLE_CLK_DIV 2 )( input wire clk_100m, input wire rst_n, input wire [CH_WIDTH-1:0] ch_in_raw, output reg [CH_WIDTH-1:0] sample_data ); reg [CH_WIDTH-1:0] sync_stage1; reg [CH_WIDTH-1:0] sync_stage2; reg [7:0] clk_div_cnt; always (posedge clk_100m or negedge rst_n) begin if (!rst_n) begin sync_stage1 8h00; sync_stage2 8h00; end else begin sync_stage1 ch_in_raw; sync_stage2 sync_stage1; end end always (posedge clk_100m or negedge rst_n) begin if (!rst_n) begin clk_div_cnt 8h00; sample_data 8h00; end else if (clk_div_cnt SAMPLE_CLK_DIV-1) begin clk_div_cnt 8h00; sample_data sync_stage2; end else begin clk_div_cnt clk_div_cnt 1b1; end end endmodule這段代碼中sync_stage1和sync_stage2構(gòu)成了打兩拍的同步鏈消除亞穩(wěn)態(tài)的影響。clk_div_cnt是采樣時鐘分頻計數(shù)器步長由頂層傳入的SAMPLE_CLK_DIV參數(shù)控制。當計數(shù)器計滿時把同步后的數(shù)據(jù)鎖存到sample_data中。參數(shù)化的設(shè)計讓三檔采樣率切換變得很簡單100MHz 采樣檔位時SAMPLE_CLK_DIV150MHz 檔位時等于 220MHz 檔位時等于 5。這樣采樣模塊不需要改代碼只需改頂層例化時傳入的參數(shù)。實際使用時需要留意分頻計數(shù)值必須大于等于 1否則計數(shù)器永遠達不到計滿條件這個邊界情況在代碼注釋里已經(jīng)標明。4.2 觸發(fā)模塊邊沿觸發(fā)和匹配觸發(fā)兩種模式實現(xiàn)觸發(fā)模塊是整個邏輯分析儀的智能所在。它的功能是根據(jù)設(shè)定的條件決定何時開始存儲數(shù)據(jù)。本設(shè)計實現(xiàn)了兩種觸發(fā)模式邊沿觸發(fā)和數(shù)據(jù)匹配觸發(fā)。邊沿觸發(fā)方式下用戶可以指定某個通道的上升沿或下降沿作為觸發(fā)條件數(shù)據(jù)匹配觸發(fā)方式下當 8 個通道的數(shù)據(jù)組合與設(shè)定的匹配值相等時產(chǎn)生觸發(fā)信號。觸發(fā)模式的切換通過頂層撥碼開關(guān)實現(xiàn)兩個模式共用同一組輸入數(shù)據(jù)總線。module trigger_module #( parameter CH_WIDTH 8, parameter EDGE_CH 0 )( input wire clk_sys, input wire rst_n, input wire [CH_WIDTH-1:0] sampled_data, input wire [1:0] trigger_mode, // 2b00: 上升沿, 2b01: 下降沿, 2b10: 數(shù)據(jù)匹配 input wire [CH_WIDTH-1:0] match_value, output reg trigger_flag ); reg [CH_WIDTH-1:0] data_d1; wire rising_edge sampled_data[EDGE_CH] ~data_d1[EDGE_CH]; wire falling_edge ~sampled_data[EDGE_CH] data_d1[EDGE_CH]; always (posedge clk_sys or negedge rst_n) begin if (!rst_n) begin data_d1 8h00; end else begin data_d1 sampled_data; end end always (posedge clk_sys or negedge rst_n) begin if (!rst_n) begin trigger_flag 1b0; end else begin case (trigger_mode) 2b00: trigger_flag rising_edge; 2b01: trigger_flag falling_edge; 2b10: trigger_flag (sampled_data match_value); default: trigger_flag 1b0; endcase end end endmodule邊沿檢測的實現(xiàn)方式是典型的當前值與前一個周期值的組合邏輯比較只消耗極少的資源。trigger_mode的低兩位分別對應兩種邊沿檢測第三種模式為數(shù)據(jù)匹配。匹配觸發(fā)還有一個增強設(shè)計支持屏蔽某些通道即只比較指定的幾個通道數(shù)據(jù)是否等于期望值。做法是增加一個 8 位的mask_in輸入比較時先做按位與操作再比較這樣就算某個通道的數(shù)據(jù)是浮空狀態(tài)也不會干擾匹配判斷。觸發(fā)信號輸出為單周期高電平脈沖這個脈沖直接送進存儲模塊作為寫地址的啟動信號。4.3 存儲模塊雙口 RAM 的讀寫時序與預觸發(fā)設(shè)計存儲模塊采用 Xilinx 原語或 Altera 的 RAM 宏模塊實現(xiàn)例化時選擇雙口模式寫時鐘由系統(tǒng)時鐘驅(qū)動讀時鐘由 VGA 像素時鐘驅(qū)動。存儲深度 8K、位寬 8 位可以同時覆蓋顯示模塊連續(xù)讀取的需求。關(guān)鍵設(shè)計是預觸發(fā)功能當觸發(fā)信號到達時寫地址已經(jīng)被寫到了深度四分之一的固定位置之后的采樣數(shù)據(jù)繼續(xù)寫入直到地址循環(huán)回起點為止。這樣存儲下來的是觸發(fā)前一段、觸發(fā)后一段的完整波形對定位異常時序非常有幫助。module storage_module #( parameter DEPTH 8192, parameter ADDR_WIDTH 13 )( input wire wr_clk, input wire rd_clk, input wire rst_n, input wire [7:0] wr_data, input wire trigger_pulse, input wire wr_enable, output wire [7:0] rd_data, output wire [ADDR_WIDTH-1:0] rd_addr ); reg [ADDR_WIDTH-1:0] wr_addr; reg [ADDR_WIDTH-1:0] rd_addr_reg; reg trigger_latched; always (posedge wr_clk or negedge rst_n) begin if (!rst_n) begin wr_addr 13h0000; trigger_latched 1b0; end else if (trigger_pulse) begin trigger_latched 1b1; wr_addr {1b0, {(ADDR_WIDTH-1){1b1}}}; // 預觸發(fā)位置 1/4 end else if (wr_enable) begin wr_addr wr_addr 1b1; end end // RAM 例化代碼省略使用廠商宏模塊 // 讀地址由顯示模塊產(chǎn)生rd_addr 直接透傳 assign rd_data ram_out; assign rd_addr rd_addr_reg; endmodule存儲模塊的細節(jié)在于trigger_latched的用法——首輪觸發(fā)后就不再響應新的觸發(fā)脈沖保證一次采樣過程只記錄一段波形。使用者將wr_enable與采樣模塊的輸出有效信號相連確保只在有效數(shù)據(jù)到來時才遞增地址。當用戶按下“單次捕獲”按鍵時觸發(fā)模塊被復位地址清零等待下一次觸發(fā)這樣就能穩(wěn)定地捕獲單次事件。讀地址的生成邏輯很直接rd_addr_reg在 VGA 的每個行有效顯示期間遞增一行對應讀取 640 個像素點正好對應存儲深度的一段。這里隱含的約束是一幀畫面讀取的數(shù)據(jù)量等于 640×480 個點而存儲深度是 8192 個點所以一次捕獲的波形會被重復掃描多行來填滿整個屏幕。這種設(shè)計在波形顯示時是合理的因為同一段波形在每行重復繪制看起來就像一條連續(xù)的水平線。4.4 VGA 顯示模塊行場時序和波形繪制原理VGA 顯示模塊按經(jīng)典 640x48060Hz 時序?qū)崿F(xiàn)。行同步參數(shù)為每行 800 個像素時鐘其中顯示區(qū) 640 個前肩 16 個同步脈沖 96 個后肩 48 個。場同步參數(shù)為每場 525 行其中顯示區(qū) 480 行前肩 10 行同步脈沖 2 行后肩 33 行。這些是固定參數(shù)任何一份 VGA 時序文檔都有。module vga_display #( parameter H_DISPLAY 640, parameter V_DISPLAY 480, parameter H_FRONT 16, parameter H_SYNC 96, parameter H_BACK 48, parameter V_FRONT 10, parameter V_SYNC 2, parameter V_BACK 33, parameter DATA_WIDTH 8 )( input wire pix_clk, // 25.175MHz 像素時鐘 input wire rst_n, input wire [DATA_WIDTH-1:0] sample_data, output wire hsync, output wire vsync, output wire [2:0] rgb_out // 3 位 RGB紅綠藍各 1 位 ); reg [9:0] h_cnt; reg [9:0] v_cnt; reg [2:0] rgb_reg; // 行場計數(shù)器遞增邏輯 always (posedge pix_clk or negedge rst_n) begin if (!rst_n) begin h_cnt 10d0; v_cnt 10d0; end else if (h_cnt H_TOTAL-1) begin h_cnt 10d0; if (v_cnt V_TOTAL-1) v_cnt 10d0; else v_cnt v_cnt 1b1; end else begin h_cnt h_cnt 1b1; end end // 行場同步信號生成 assign hsync (h_cnt H_DISPLAY H_FRONT h_cnt H_DISPLAY H_FRONT H_SYNC) ? 1b0 : 1b1; assign vsync (v_cnt V_DISPLAY V_FRONT v_cnt V_DISPLAY V_FRONT V_SYNC) ? 1b0 : 1b1; // 波形繪制根據(jù)采樣數(shù)據(jù)電平?jīng)Q定像素顏色 always (*) begin if (h_cnt H_DISPLAY v_cnt V_DISPLAY) begin if (sample_data[v_cnt[3:0]] 1b1) rgb_reg 3b111; // 高電平顯示白色 else rgb_reg 3b000; // 低電平顯示黑色 end else begin rgb_reg 3b000; // 消隱區(qū)顯示黑色 end end assign rgb_out rgb_reg; endmodule波形繪制的思路是把 8 個通道顯示在屏幕的不同垂直位置。假設(shè)每個通道占 60 像素行第 0 通道在屏幕下方第 7 通道在屏幕上方。當前掃描行的v_cnt對應的通道號為(V_DISPLAY - v_cnt) / 60該通道的采樣值決定當前像素是白還是黑。網(wǎng)格線可以在額外的像素判定邏輯中實現(xiàn)——每行或每列取模 32 的像素點上強制顯示為灰色這樣波形有一個坐標系的參照。顯示模塊的調(diào)試經(jīng)驗是用chipscope或signal tap觀察h_cnt和v_cnt的波形確認它們按照預期遞增。常見問題是像素時鐘頻率不準確導致畫面偏左或偏右可以通過微調(diào)分頻器的計數(shù)值解決。VGA 顯示對時鐘抖動不敏感用 PLL 生成的 25.175MHz 或者直接分頻得到 25MHz 都可以正常工作顯示器會自動校正微小的偏差。5. 常見問題避坑這幾個翻車點最容易在調(diào)試時卡住5.1 亞穩(wěn)態(tài)采樣數(shù)據(jù)和觸發(fā)標志跨時鐘域時不打拍現(xiàn)象波形顯示時偶爾出現(xiàn)一個通道的電平毛刺或者觸發(fā)后存儲的數(shù)據(jù)里出現(xiàn)幾位明顯異常的值。 原因采集模塊和存儲模塊工作在不同時鐘域數(shù)據(jù)直接跨域傳遞時觸發(fā)亞穩(wěn)態(tài)導致采樣值處于中間電平被誤判為高或低。 解決嚴格按照兩級觸發(fā)器同步的方式處理單比特信號多比特數(shù)據(jù)總線通過異步 FIFO 或雙口 RAM 的獨立讀寫時鐘隔離。在 FPGA 設(shè)計里時鐘域邊界的安全性是首要考慮。A 同學第一次做這個項目時偷懶省了同步器結(jié)果波形隨機跳變排查了兩天才意識到是同步問題。5.2 VGA 畫面偏移或者閃動現(xiàn)象顯示器上的波形整體偏向一側(cè)或者整個畫面周期性閃動。 原因行場同步參數(shù)設(shè)置錯誤或者像素時鐘頻率偏差過大。另一個常見原因是 RGB 消隱期間沒有輸出黑色導致顯示器在回掃期間畫出色帶。 解決先對照標準 VGA 時序表逐項核對參數(shù)確認H_FRONT、H_SYNC、H_BACK的值。然后用示波器測量像素時鐘頻率誤差控制在百分之五以內(nèi)即可。消隱區(qū)必須強制輸出黑色即rgb_reg 0這個邏輯在代碼中的else分支里已經(jīng)處理。如果畫面整體偏右調(diào)大H_FRONT的值偏左則調(diào)小。5.3 觸發(fā)條件能捕捉到但波形不對現(xiàn)象按下觸發(fā)按鍵后存儲模塊開始寫入但波形只顯示觸發(fā)后的數(shù)據(jù)看不到觸發(fā)前的狀態(tài)。 原因預觸發(fā)深度設(shè)置不對或者觸發(fā)信號響應后trigger_latched邏輯沒有正確生效。 解決檢查存儲模塊中預觸發(fā)位置的賦值邏輯確認觸發(fā)信號到來時寫地址被置為四分之一深度處且之后繼續(xù)遞增。這個機制要配合頂層按鍵的“單次捕獲”模式使用在軟件或撥碼開關(guān)處在連續(xù)模式時反復觸發(fā)會覆蓋之前的存儲內(nèi)容看不出預觸發(fā)效果。5.4 采樣率設(shè)置過高導致顯示波形太密現(xiàn)象用 100MHz 采樣率抓 UART 信號屏幕上波形密密麻麻單個字節(jié)的位時序完全看不清。 原因采樣率和顯示分辨率的關(guān)系沒理清。100MHz 采樣率抓 9600 波特率的 UART一個比特位有 10417 個采樣點8K 深度下只能顯示不到一個字節(jié)。 解決根據(jù)預計的信號帶寬選擇合適的采樣率檔位。低速串行信號用 20MHz 即顯示充足細節(jié)。如果確實需要高采樣率又希望看長時間波形需要擴展存儲深度或增加縮放功能。這個限制在設(shè)計時就要清楚并在答辯時講出這個權(quán)衡過程是加分項。5.5 按鍵控制失靈單次捕獲和連續(xù)捕獲模式切換不靈現(xiàn)象按下“單次捕獲”按鍵后觸發(fā)模塊沒有響應再按一次才生效。 原因機械按鍵存在抖動沒有做消抖處理。觸發(fā)模塊對單周期脈沖敏感抖動的電平變化會產(chǎn)生多次觸發(fā)。 解決給按鍵模塊增加 20ms 延時消抖邏輯確認穩(wěn)定后在按鍵釋放時產(chǎn)生一個單周期脈沖。另一個點是將“單次捕獲”和“連續(xù)捕獲”模式分別綁定到不同按鍵通過頂層狀態(tài)機管理。這些邏輯單獨驗證后再集成到總系統(tǒng)排查起來更省力。6. 驗收方法與答辯要點把調(diào)試過程變成得分點6.1 分模塊驗收功能驗證的先后順序驗收工作不應該等到所有模塊都完成才開始。通常的做法是先驗證 VGA 輸出讓顯示模塊輸出彩條或棋盤格確認顯示器畫面正常這一步排除了時序問題的最大干擾源。接著驗證存儲模塊從 FPGA 內(nèi)部 ROM 讀取一段已知數(shù)據(jù)寫入存儲通過 VGA 顯示后觀察是否與預期一致。最后驗證采集與觸發(fā)用信號發(fā)生器注入方波或者由一塊單片機產(chǎn)生的 UART 數(shù)據(jù)觀察波形形狀和觸發(fā)位置是否正確。按這個順序排查每個階段的問題都局限在當前模塊定位速度快得多。6.2 指標驗收的具體方法在交付驗收環(huán)節(jié)重點驗證三個指標。采樣率準確性用已知頻率的信號實測如果注入 1MHz 方波屏幕上應該顯示 50% 占空比的波形且一個周期對應的水平像素寬度與理論值相符。存儲深度驗證方法是觸發(fā)測量一段已知長度的信號計算波形起點到終點的距離是否等于 8K 個采樣點。觸發(fā)準確率通過重復注入特定模式的數(shù)據(jù)來測試比如連續(xù)發(fā)送 100 次 I2C 起始條件統(tǒng)計觸發(fā)成功的次數(shù)每次都要有響應且預觸發(fā)區(qū)域的波形完整。6.3 答辯技巧講清楚三個關(guān)鍵決策答辯時不需要把每個模塊的代碼都講一遍重點講三個設(shè)計決策及其權(quán)衡。第一為什么選 Block RAM 而不是 SDRAM——從開發(fā)周期和資源占用角度解釋。第二為什么 VGA 采用 3 位 RGB 而不是更高位——強調(diào)簡潔性和需求匹配度。第三預觸發(fā)深度為什么選四分之一——用抓取異常信號的實例證明這個值的合理性。把這些邏輯講清楚比羅列代碼更能證明設(shè)計能力。有人曾經(jīng)把整個代碼從頂層到底層過一遍導師追問“為什么這里打兩拍為什么觸發(fā)地址是這個值”答不上來得分反而不如只講設(shè)計思路但講得透徹的同學。從那以后每次做完一個 FPGA 項目都強制自己走一遍“需求 → 指標 → 實現(xiàn) → 驗收”的閉環(huán)把每個模塊之間的交互接口先定義清楚再開始寫代碼。這次邏輯分析儀的方案也是這樣模塊之間的信號定義、跨時鐘域策略、驗收方法都在動手前就梳理完畢。希望這篇方案能幫到你做出自己的邏輯分析儀。本文還有配套的精品資源點擊獲取