再談fpga開發(fpga調試方法)

【 聲明:版權所有,歡迎轉載,請勿用于商業用途。 聯系信箱:feixiaoxing @163.com】

? ? ? ? 我們之前在學校學習c、c++的時候,其實學校漏掉了很重要的一個教學環節,那就是調試、測試。很多時候我們代碼寫出來了,不知道怎么測試、調試。其實fpga也是一樣的。fpga本質上還是信號的處理,我們與其說是寫代碼,不如說是設計電路。這個電路以寄存器和時序電路為基礎,以組合電路為輔,通過狀態機、協議和流程共同實現一個模塊的開發。那么這個模塊寫的對不對,就需要通過調試來進行判別了。

1、做好設計

? ? ? ? 設計是我們所有工作的起點,這個設計的來源,一方面是需求,一方面是標準協議,還有一方面來自于fpga的現實接口約束。在開發之前,就要想好解決什么問題,系統的協議、交互邏輯和狀態機是什么樣的。子模塊的信號,甚至可以提前把波形設計好,這樣就可以直接轉化成verilog代碼了。后續的調試就變成對這個波形的確認。

2、仿真調試

? ? ? ? 仿真是很重要的一個環節。fpga相比較c語言編程有一個缺點,那就是綜合、編譯的速度會比較慢。在前期開發調試的時候,沒有必要直接上板子測試,這和嵌入式開發是一樣的。能仿真的部分,盡量用仿真來解決。簡單一點的iverilog+gtkwave仿真,復雜一點的modelsim仿真,都是可以去做的。仿真的部分,盡可能做成自動化測試,用類似python之類的腳本串起來,這樣效率會比較高。仿真本身解決的是邏輯層面的問題,如果邏輯層面都有問題,直接上fpga基本就是浪費時間。

3、會查看時序報告

? ? ? ? 前面說過,仿真只是解決功能層面是否正確,但是時序層面是不是正確,需要通過綜合時得到的時序報告,去進行判斷。實際fpga驗證的時候,最好把這些關鍵路徑做一個時序優化。這里面最主要的方法,就是組合邏輯拆分、case優化、做延時tap。修改后,通常需要回頭重新做一下仿真測試。測試沒問題之后,繼續修正時序,直到得到想要的結果。畢竟我們總是希望頻率越高越好,而頻率收到關鍵路徑的約束,所以只好通過識別關鍵路勁,通過優化來不斷提高處理頻率。

? ? ? ? 時序的本質,其實就在于兩個clock之間的組合邏輯,是否可以滿足時鐘約束的要求。我們編寫時序電路的時候,中間會有很多的判斷條件。這些判斷條件綜合出來,很多都是組合邏輯。這些組合邏輯如果過于復雜和冗長,其實是需要進行優化和拆分的,這就是時序分析的根本來源。

4、添加串口打印

? ? ? ? 串口本身還是非常方便的,一個fifo模塊,再加一個uart,就可以通過循環打印的方式,不停把狀態機里面的信號讀出來,非常方便。如果奢侈一點的話,可以自己準備一個軟核cpu,這樣還可以通過軟核+串口的方式,直接編程解決ip內部的調試問題。要做到這一點,就要對編譯器、鏈接器、匯編、二進制代碼有所了解。某種意義上,這就相當于一個小型的mcu開發了。

5、output pin

? ? ? ? 這里的outpin就不僅僅是串口打印,而是內部的register、wire信號查看,綁定到外部的pin而已。原理是比較簡單,就是開發效率比較低。因為想看什么信號,每次都需要通過重新綜合+外部示波器查看的辦法來解決。當然如果對cpu軟核和嵌入式軟件不算太了解,這也是很有效的一種調試方式。

6、signal tap

? ? ? ? signal tap的本意就是通過內置signal ram的方式,把一部分運行信號鎖到ram里面,再通過jtag的方式把信號送出來。因為signal tap本身是占有一定資源的,所以實際使用的時候,必須有選擇性地去挑選一些信號進行debug處理。本質上,signal tap就是一個藏在fpga里面的小示波器。挑選哪些信號,怎么觸發,都是可以通過ide進行設置的。和output pin一樣,它也需要在每次調試的時候,重新進行綜合處理。

7、其他

? ? ? ? 對fpga的調試,其實很大程度上取決于自己對于軟件的理解、對于數字電路的理解。實際開發的時候,要把自己想象成一個cpu、一個時序和組合邏輯模塊,而不是單純的verilog代碼,這樣會調試起來好很多。出現問題,優先從原理入手,原理沒問題再看電路、看信號、看打印,這樣一步步去解決,最終肯定會找到問題的所在。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/93090.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/93090.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/93090.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言中的數據結構--棧和隊列(1)

前言本屆開始我們將對數據結構中棧的內容進行講解,那么廢話不多說,我們正式進入今天的學習棧棧是一種很特殊的線性表,它只能在固定的一端進行插入和刪除操作,進行數據的插入和刪除的一端叫做棧頂,另外一端叫做棧底,棧中的元素遵守…

字符串是數據結構還是數據類型?

比較糾結的一個問題,以下是在網上查到后總結的,不知道對不對,歡迎討論。這是個觸及計算機科學核心概念的精妙問題!字符串既可以被視為一種數據類型,也可以被視為一種數據結構,這取決于你觀察的視角和討論的…

Cline與Cursor深度實戰指南:AI編程助手的革命性應用

引言 在AI編程工具快速發展的今天,Cline和Cursor作為兩款備受矚目的AI編程助手,正在重新定義開發者的工作方式。作為一名深度使用這兩款工具的開發者,我在過去一年的實踐中積累了豐富的經驗和獨到的見解。本文將從技術角度深入分析Cline和Cur…

根本是什么

根本是什么 根本沒有了,枝葉還在么? 沒有了內涵,外延還有么? 丟棄了根本,再嗨也是無意義,無根據空虛之樂罷了。 人之所行所言所思所想所念皆欲念、歷程感懷,情思。所謂得失過往,時空…

springboot基于Java的人力資源管理系統設計與實現

管理員:登錄,個人中心,部門管理,員工管理,培訓信息管理,員工獎勵管理,員工懲罰管理員工考核管理,調薪信息管理,員工調動管理,員工工資管理員工:注…

金字塔降低采樣

文章目錄image_scale.hppimage_scale.cppmainimage_scale.hpp #ifndef IMAGE_SCALE_HPP #define IMAGE_SCALE_HPP#include <vector> #include <cstdint> #include <utility> // for std::pair #include <algorithm> #include <string> enum cl…

Filament引擎(四)——光照渲染Froxelizer實現分析

Froxelizer主要是用于filament光照效果的實現&#xff0c;生成光照渲染時所需的必要信息&#xff0c;幫助渲染過程中明確哪些區域受哪些光源所影響&#xff0c;是Filament中保證光照效果渲染效率的核心所在。這部分的源碼&#xff0c;可以結合filament官方文檔中Light Path部分…

2025 環法對決,VELO Angel Glide 坐墊輕裝上陣

2025環法第16賽段的風禿山之巔&#xff0c;當最后一縷夕陽沉入云層&#xff0c;山風裹挾著礫石的氣息掠過賽道&#xff0c;一場足以載入史冊的激戰正酣。帕雷-潘特的肌肉在汗水里賁張&#xff0c;鏈條與齒輪的咬合聲混著粗重喘息&#xff0c;在171.5公里賽程的最后3公里陡坡上&…

Linux程序->進度條

進度條最終效果&#xff1a; 目錄 進度條最終效果&#xff1a; 一&#xff1a;兩個須知 1&#xff1a;緩沖區 ①&#xff1a;C語言自帶緩沖區 ②&#xff1a;緩沖區的刷新策略 2&#xff1a;回車和換行的區別 二&#xff1a;倒計時程序 三&#xff1a;入門板進度條的實…

Python爬蟲實戰:研究tldextract庫相關技術構建新聞網站域名分析爬蟲系統

1. 引言 網絡爬蟲作為一種自動獲取互聯網信息的技術,在數據挖掘、信息檢索、輿情分析等領域有著廣泛的應用。Python 因其豐富的庫和簡潔的語法,成為了開發爬蟲的首選語言。tldextract 是 Python 中一個強大的域名解析庫,能夠準確地從 URL 中提取頂級域名、二級域名等關鍵信…

【算法-華為機試-火星基地改造】

基地改造題目描述目標輸入輸出代碼實現題目描述 在2XXX年&#xff0c;人們發現了一塊火星地區&#xff0c;這里看起來很適合建設新家園。但問題是&#xff0c;我們不能一次性將這片地區的空氣變得適合人類居住&#xff0c;得分步驟來。 把這片火星地區想象成一個巨大的棋盤。棋…

C++入門自學Day1-- C語言的宏函數和C++內聯函數

一、函數調用開銷函數調用會涉及&#xff1a;參數壓棧&#xff08;或寄存器傳參&#xff09;跳轉到函數體返回值處理棧幀銷毀這個過程對小函數來說可能非常浪費&#xff0c;因此&#xff0c;宏函數和內聯函數的目的就是避免“函數調用的開銷”&#xff0c;通過代碼展開&#xf…

Pytorch混合精度訓練最佳實踐

混合精度訓練&#xff08;Mixed Precision Training&#xff09;是一種通過結合單精度&#xff08;FP32&#xff09;和半精度&#xff08;FP16/FP8&#xff09;計算來加速訓練、減少顯存占用的技術。它在保持模型精度的同時&#xff0c;通常能帶來 2-3 倍的訓練速度提升&#x…

Qt C++動態庫SDK在Visual Studio 2022使用(C++/C#版本)

01 將C SDK 集成到 IDE 中以下是在 Microsoft Visual Studio 平臺下 SDK 的集成。2.1 Visual Studio 平臺下 C/C環境配置及集成到 IDE 中xxx.lib 和 xxx.dll 適合在 Windows 操作系統平臺使用&#xff0c;這里以 VS2022 環境為例。2.1.1 C/C 工程環境配置與集成1、C# SDK 接口…

大語言模型 LLM 通過 Excel 知識庫 增強日志分析,根因分析能力的技術方案(2):LangChain + LlamaIndex 實現

文章大綱 1 技術原理總覽 2 詳細實現步驟(含代碼) 2.1 環境準備 2.2 Excel → LlamaIndex 節點 2.3 構建向量索引(FAISS 本地) 2.4 Google Cloud 向量檢索(可選替換 FAISS) 2.5 LangChain 問答鏈 A. RAG 模式(向量檢索 + LLM 生成) B. SQL 模式(無 RAG,直接查表) 2.…

提升ARM Cortex-M系統性能的關鍵技術:TCM技術解析與實戰指南

文章目錄引言一、TCM基礎架構與工作原理1.1 TCM的物理特性1.2 與緩存機制的對比1.3 ARM Cortex-M系列對TCM的支持二、TCM的典型應用場景2.1 實時中斷處理2.2 低功耗模式下的待機代碼2.3 高性能算法執行2.4 系統初始化階段的關鍵代碼三、實戰指南&#xff1a;在STM32H7上配置和優…

大數據之路:阿里巴巴大數據實踐——大數據領域建模綜述

為什么需要數據建模 核心痛點 數據冗余&#xff1a;不同業務重復存儲相同數據&#xff08;如用戶基礎信息&#xff09;&#xff0c;導致存儲成本激增。計算資源浪費&#xff1a;未經聚合的明細數據直接參與計算&#xff08;如全表掃描&#xff09;&#xff0c;消耗大量CPU/內存…

實戰演練1:實戰演練之命名實體識別

實戰演練1:實戰演練之命名實體識別 命名實體識別簡介 代碼 命名實體識別簡介 什么是命名實體識別任務 命名實體識別(Named Entity Recognition,簡稱NER)是指識別文本中具有特定意義的實體,主要包括人名、地名、機構名、專有名詞等。通常包括兩部分: (1)實體邊界識別。(2)確定…

數據結構基礎內容(第七篇:堆、哈夫曼樹)

# 堆 Heap 優先隊列(Priority Queue) 結構性:用 *數組* 表示的完全二叉樹; 有序性:任一結點的關鍵字是其子樹所有結點的最大值(或最小值) * “最大堆(MaxHeap)”,也稱“大頂堆”:最大值 * “最小堆(MinHeap)”,也稱“小頂堆” :最小值 主要操作有: ? MaxHeap Create( i…

CS231n-2017 Lecture7訓練神經網絡(二)筆記

本節主要是神經網絡的動態部分&#xff0c;也就是神經網絡學習參數和搜索最優超參數的過程梯度檢查&#xff1a;進行梯度檢查&#xff0c;就是簡單地把解析梯度與數值計算梯度進行比較&#xff0c;防止反向傳播的邏輯出錯&#xff0c;僅在調試過程中使用。有如下技巧 &#xff…