Vivado自定義IP核學習筆記

文章目錄

    • 【1】創建一個新的IP核
    • 【2】實現功能
    • 【3】編輯IP核
    • 【4】IP封裝
    • 【5】創建Vivado工程

【1】創建一個新的IP核

  • 1.1 打開Vivado->點擊【Tasks->Manage IP->New IP Location】->彈出窗口
  • 1.2 【Next】->設置IP屬性->【Finish】->【OK】
    • 【IP Location】:E:/work/fpga/custom_ip
    • 【Part】為開發板型號,可重新指定
  • 1.3【菜單欄/Tools/Create and Package New IP…】->【Next】->選中【Create a new AXI4 Periperal】->【Next】->設置IP核細節,只需改下名->【Next】
    • 我的IP核【Name】breath_led_ip
  • 1.4 設置AXI接口【Next】->【Finish】
    • 將【Name】改為S0_AXI
  • 1.3 右鍵【User Repository->AXI Peripheral->breath_led_ip_v1.0】->【Edit in IP Packager】->【OK】

至此,會打開一個新的工程。

【Add Interfaces】窗口中一些參數的解釋。

  • 【Interface Tpye】接口類型
    • 【Lite】簡化版的 AXI4 接口,用于較少數據量的存儲映射通信
    • 【Full】高性能存儲映射接口,用于較多數據量的存儲映射通信
    • 【Stream】用于高速數據流傳輸,非存儲映射接口。
  • 【Interface Mode】接口模式):有 Slave(從機)和 Master(主機)兩種模式可選

【2】實現功能

這步比較輕車熟路了,右鍵【Design Sources】->【Add Sources】->【Add or create design sources】->【Next】->【Create Files】->填入文件名和路徑->【Finish】->【OK】->【Yes】

  • 【File name】breath_led
  • 【File locaion】 項目路徑\ip_repo\breath_led_ip_1.0\hdl

打開【breath_led.v】文件,編輯代碼如下。

module breath_led(input          sys_clk        , //系統時鐘 50MHzinput          sys_rst_n      , //系統復位,低電平有效input          sw_ctrl        , //呼吸燈開關控制信號 1:亮 0:滅input          set_en         , //設置呼吸燈頻率設置使能信號input   [9:0]  set_freq_step  , //設置呼吸燈頻率變化步長output         led              //LED燈
);//parameter define
parameter  START_FREQ_STEP = 10'd1; //設置頻率步長初始值
parameter CNT_2US_MAX = 7'd100;    
parameter CNT_2MS_MAX = 10'd1000; 
parameter CNT_2S_MAX  = 10'd1000; //reg define
reg [6:0] cnt_2us; 
reg [9:0] cnt_2ms;   
reg [9:0] cnt_2s;     
reg       inc_dec_flag; //亮度遞增/遞減 0:遞增 1:遞減
reg [9:0] freq_step   ; //呼吸燈頻率間隔步長
reg       led_t       ;assign led = led_t & sw_ctrl;//設置頻率間隔,頻率步長值在1-10之間
always @(posedge sys_clk) beginif(!sys_rst_n)freq_step <= START_FREQ_STEP;else if(set_en) beginif(set_freq_step == 0)freq_step <= 10'd1;else if(set_freq_step >= 10'd10)freq_step <= 10'd10;else    freq_step <= set_freq_step;end        
end//cnt_2us:計數2us
always@(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)cnt_2us <= 7'b0;else if(cnt_2us == (CNT_2US_MAX - 7'b1 ))cnt_2us <= 7'b0;elsecnt_2us <= cnt_2us + 7'b1;
end//cnt_2ms:計數2ms
always@(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)cnt_2ms <= 10'b0;else if(cnt_2ms == (CNT_2MS_MAX - 10'b1) && cnt_2us == (CNT_2US_MAX - 7'b1))cnt_2ms <= 10'b0;else if(cnt_2us == CNT_2US_MAX - 7'b1)cnt_2ms <= cnt_2ms + 10'b1;elsecnt_2ms <= cnt_2ms;
end//cnt_2s:計數2s
always@(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)cnt_2s <= 10'b0;else if(cnt_2s >= (CNT_2S_MAX - 10'b1) && cnt_2ms == (CNT_2MS_MAX - 10'b1) && cnt_2us == (CNT_2US_MAX - 7'b1))cnt_2s <= 10'b0;else if(cnt_2ms == (CNT_2MS_MAX - 10'b1) && cnt_2us == (CNT_2US_MAX - 7'b1))cnt_2s <= cnt_2s + freq_step;elsecnt_2s <= cnt_2s;         
end//inc_dec_flag為低電平,led燈由暗變亮,inc_dec_flag為高電平,led燈由亮變暗
always@(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)inc_dec_flag <= 1'b0;else if(cnt_2s >= (CNT_2S_MAX - 10'b1) && cnt_2ms ==( CNT_2MS_MAX - 10'b1) && cnt_2us == (CNT_2US_MAX - 7'b1))inc_dec_flag <= ~inc_dec_flag;elseinc_dec_flag <= inc_dec_flag;
end//led:輸出信號連接到外部的led燈
always@(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)led_t <= 1'b0;else if((inc_dec_flag == 1'b1 && cnt_2ms >= cnt_2s) || (inc_dec_flag == 1'b0 && cnt_2ms <= cnt_2s))led_t <= 1'b1;elseled_t<= 1'b0;
endendmodule

【3】編輯IP核

由于【breath_led.v】文件未被引用,故而被歸入【Unreferenced】文件夾下。接下來修改其頂層代碼。

  • 3.1 雙擊【Design Sources/breath_led_ip_v1_0】,編輯其代碼。
    • 在參數設置塊中添加 parameter START_FREQ_STEP = 10'd1,
    • 在輸入輸出塊中添加 output led,
    • 在實例化模塊的語句中添加 .START_FREQ_STEP(START_FREQ_STEP),
    • 在實例化初始化語句中添加 .led(led),
  • 3.2 雙擊【breath_led_ip_v1_0】下方的【breath_led_ip_v1_0_S0_AXI_inst】,編輯其代碼
    • 在參數設置塊中添加 parameter START_FREQ_STEP = 10'd1,
    • 在輸入輸出塊中添加 output led,
    • 在代碼結尾,對breath_led.v文件進行實例化,即在【endmoule】上方Add User logic here的提示下,添加
      breath_led #(.START_FREQ_STEP(START_FREQ_STEP))u_breath_led(.sys_clk (S_AXI_ACLK),.sys_rst_n (S_AXI_ARESETN),.sw_ctrl (slv_reg0[0]), .set_en (slv_reg1[31]),.set_freq_step (slv_reg1[9:0]),.led (led)
      ); 
      

至此,我們剛剛創建的【breath_led.v】文件就會被納入【breath_led_ip_v1_0_S0_AXI_inst】下方。

【4】IP封裝

  • 4.1 【Run Synthesis】->如果提示保存,則保存->【OK】->完成后點【Cancel】

  • 4.2 雙擊【Design Sources->IP-XACT->component.xml】,進行IP封裝

  • 4.3 進入【Compatibility】->【?】->Add Family Explicity->勾選zynq(Zynq-7000),Life-Cycle選擇Pre-Production->【OK】

  • 4.4 進入【File Groups】->【Merge Changes from Groups Wizard】

  • 4.5 進入【Customization Parameters】->Merge Changes from Customization Parameters Wizard->右鍵【Hidden Parameters/START_FREQ_STEP】->【Edit Parameter】,按下面的設置,設置完成后點擊【OK】

    • 勾選【Visible in Customization GUI】
    • Format設為【long】
    • 勾選【Specify Range】,Type設為【Range of integers】,最小值和最大值設為1到10。
    • 【Default Value】設為1
    • 在這里插入圖片描述
  • 4.6 進入【Review and Package】->【IP has been modified】->【Re-Package IP】->【Yes】

至此,該工程會被關閉,在【…\drivers\breath_led_ip_v1_0\src】路徑中,會生成C語言的源文件、頭文件和makefile文件。修改makefile文件,在其libs段的上方,添加

OBJECTS = $(addsuffix .o, $(basename $(wildcard *.c)))
ASSEMBLY_OBJECTS = $(addsuffix .o, $(basename $(wildcard *.S)))

將make clean上方的代碼修改為

$(ARCHIVER) -r ${RELEASEDIR}/${LIB} ${OBJECTS} ${ASSEMBLY_OBJECTS}

修改其clean段代碼為

rm -rf ${OBJECTS} ${ASSEMBLY_OBJECTS}

【5】創建Vivado工程

  • 5.1 新建一個Vivado工程,名字為【user_led】,路徑與custom_ip一致,選擇你用的開發板->【菜單欄/Tools/Setting】

  • 5.2 進入【IP/Repository】->【?】->找到剛剛創建的IP核路徑,文件夾【breath_led_ip_1.0】->【Select】->【OK】

  • 5.3 【Create Block Design】,名字設為system->【?】->搜索zynq并添加->雙擊模塊進入編輯界面->,添加 UART 控制器(MIO14 和 MIO15)、修改 DDR3 控制器配置->Run Block Automation

  • 5.4 【?】->搜索led->添加【breath_led_ip_v1.0】->雙擊可修改其配置

    • 在這里插入圖片描述
  • 5.5 【Run Connection Automation】自動連線->【OK】

  • 5.6 右鍵【breath_led_ip_0】的【led】引腳->【Make External】->將引出的led_0改為【led】

【6】調用與驗證

接下來要做的就沒有什么好說的了,下面只列出步驟

  • 6.1 【Generate Output Products】->【Create HDL Wrapper】
  • 6.2 【Open Elaborated Design】->【I/O Planning Layout】->led分配為J16,LVCMOS33
  • 6.2 【Generate Bitstream】->【Export Hardware】
    • 注意:如果菜單欄下方有藍色的【ELABORATED…】,需要將其x掉。
  • 6.3 創建vitis項目
#include "stdio.h"
#include "xparameters.h"
#include "xil_printf.h"
#include "breath_led_ip.h"
#include "xil_io.h"
#include "sleep.h"#define  LED_IP_BASEADDR   XPAR_BREATH_LED_IP_0_S0_AXI_BASEADDR  //LED IP基地址
#define  LED_IP_REG0       BREATH_LED_IP_S0_AXI_SLV_REG0_OFFSET  //LED IP寄存器地址0
#define  LED_IP_REG1       BREATH_LED_IP_S0_AXI_SLV_REG1_OFFSET  //LED IP寄存器地址1//main函數
int main()
{int freq_flag;      //定義頻率狀態,用于循環改變呼吸燈的呼吸頻率int led_state;      //定義LED燈的狀態xil_printf("LED User IP Test!\r\n");while(1){//根據freq_flag的標志位,切換呼吸燈的頻率if(freq_flag == 0){BREATH_LED_IP_mWriteReg(LED_IP_BASEADDR,LED_IP_REG1,0x80000001);freq_flag = 1;}else{BREATH_LED_IP_mWriteReg(LED_IP_BASEADDR,LED_IP_REG1,0x80000004);freq_flag = 0;}//獲取LED當前開關狀態   1:打開  0:關閉led_state = BREATH_LED_IP_mReadReg(LED_IP_BASEADDR,LED_IP_REG0);//如果開關關閉,打開呼吸燈if(led_state == 0){BREATH_LED_IP_mWriteReg (LED_IP_BASEADDR, LED_IP_REG0, 1);xil_printf("Breath LED ON\r\n");}sleep(8);//獲取LED當前開關狀態   1:打開  0:關閉led_state = BREATH_LED_IP_mReadReg(LED_IP_BASEADDR,LED_IP_REG0);//如果開關打開,關閉呼吸燈if(led_state == 1){BREATH_LED_IP_mWriteReg (LED_IP_BASEADDR, LED_IP_REG0, 0);xil_printf("Breath LED OFF\r\n");}sleep(1);}
}

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

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

相關文章

【面試】高級開發面試場景題

1、如何保證MySql到ES的數據一致性? 答:ES是一個開元分布式搜索和分析引擎、它提供了全文搜索、結構化搜索分析以及這些組合的能力。 全文搜索能力:ES支持復雜的搜索能力,包括模糊匹配、短語查詢、布爾查詢等,并且可以快速的返回結果 實時數據分析:實時數據分析,支持對…

《 慢 SQL 分析與 SQL 優化實戰指南》

&#x1f50d; 慢 SQL 分析與 SQL 優化實戰指南、 &#x1f9e0;前言 在數據庫性能調優中&#xff0c;慢 SQL 是性能瓶頸的常見元兇。 一次慢查詢可能會拖垮整個業務線程池&#xff0c;甚至引發鎖等待、雪崩效應。 對后端開發與 DBA 而言&#xff0c;快速定位并優化慢 SQL&am…

C#中如何運用JWT用戶認證

一、JWT概述JSON Web Token&#xff08;JWT&#xff09;是一種輕量級的身份認證機制&#xff0c;廣泛應用于分布式系統中的用戶認證。它通過緊湊的JSON格式存儲用戶身份信息&#xff0c;并使用數字簽名確保信息的完整性和真實性。與傳統的基于Session的認證相比&#xff0c;JWT…

Hibernate 使用詳解

在現代的Java開發中&#xff0c;數據持久化是一個至關重要的環節。而在眾多持久化框架中&#xff0c;Hibernate以其強大的功能和靈活性&#xff0c;成為了開發者們的首選工具。本文將詳細介紹Hibernate的原理、實現過程以及其使用方法&#xff0c;希望能為廣大開發者提供一些有…

【圖像算法 - 13】基于 YOLO12 與 OpenCV 的實時目標點擊跟蹤系統(系統介紹 + 源碼詳細)

基于 YOLO12 與 OpenCV 的實時點擊目標跟蹤系統 在計算機視覺領域&#xff0c;目標檢測與跟蹤是兩個核心任務。本文將介紹一個結合 YOLO 目標檢測模型與 OpenCV 跟蹤算法的實時目標跟蹤系統&#xff0c;該系統允許用戶通過鼠標交互選擇特定目標進行持續跟蹤&#xff0c;支持多…

【數據庫】 MySQL 表的操作詳解

在 MySQL 數據庫的日常開發與維護中&#xff0c;表的操作是最基礎且最常用的部分。本文將從 創建表、查看表結構、修改表 以及 刪除表 等方面進行詳細講解&#xff0c;并附上對應的 SQL 語句示例&#xff0c;方便在實際項目中直接應用。一、創建表 1.1 創建表語法 CREATE TABLE…

DiT: Transformer上的擴散模型

論文&#xff08;ICCV 2023&#xff09;&#xff1a;Scalable Diffusion Models with Transformers 代碼和工程網頁&#xff1a;https://www.wpeebles.com/DiT.html DiTs&#xff08;Diffusion Transformers&#xff09;是首個基于Transformer架構的擴散模型&#xff01;它在…

MySQL 索引:索引為什么使用 B+樹?(詳解B樹、B+樹)

文章目錄一、二叉查找樹(BST)&#xff1a;不平衡二、平衡二叉樹(AVL)&#xff1a;旋轉耗時三、紅黑樹&#xff1a;樹太高由一個例子總結索引的特點基于哈希表實現的哈希索引高效的查找方式&#xff1a;二分查找基于二分查找思想的二叉查找樹升級版的BST樹&#xff1a;AVL 樹四、…

ESP32入門開發·VScode空白項目搭建·點亮一顆LED燈

目錄 1. 環境搭建 2. 創建項目 3. 調試相關介紹 4. 代碼編寫 4.1 包含頭文件 4.2 引腳配置 4.3 設置輸出電平 4.4 延時函數 4.5 調試 1. 環境搭建 默認已經搭建好環境&#xff0c;如果未搭建好可參考&#xff1a; ESP32入門開發Windows平臺下開發環境的搭建…

ONLYOFFICE AI 智能體上線!與編輯器、新的 AI 提供商等進行智能交互

ONLYOFFICE AI 插件?迎來重要更新&#xff0c;帶來了新功能和更智能的交互體驗。隨著 AI 智能體&#xff08;現為測試版&#xff09;的上線、帶來更多 AI 提供商支持以及其他新功能&#xff0c;AI 插件已經成為功能強大的文檔智能助理。 關于 ONLYOFFICE ONLYOFFICE 文檔是多…

【C++進階學習】第十一彈——C++11(上)——右值引用和移動語義

前言&#xff1a; 前面我們已經將C的重點語法講的大差不差了&#xff0c;但是在C11版本之后&#xff0c;又出來了很多新的語法&#xff0c;其中有一些作用還是非常大的&#xff0c;今天我們就先來學習其中一個很重要的點——右值引用以及它所擴展的移動定義 目錄 一、左值引用和…

【IoTDB】363萬點/秒寫入!IoTDB憑何領跑工業時序數據庫賽道?

【作者主頁】Francek Chen 【專欄介紹】???大數據與數據庫應用??? 大數據是規模龐大、類型多樣且增長迅速的數據集合&#xff0c;需特殊技術處理分析以挖掘價值。數據庫作為數據管理的關鍵工具&#xff0c;具備高效存儲、精準查詢與安全維護能力。二者緊密結合&#xff0…

IEEE 2025 | 重磅開源!SLAM框架用“法向量+LRU緩存”,將三維重建效率飆升72%!

一、前言 當前研究領域在基于擴散模型的文本到圖像生成技術方面取得了顯著進展&#xff0c;尤其在視覺條件控制方面。然而&#xff0c;現有方法&#xff08;如ControlNet&#xff09;在組合多個視覺條件時存在明顯不足&#xff0c;主要表現為獨立控制分支在去噪過程中容易引入…

無人機遙控器教練模式技術要點

一、技術要點1.控制權仲裁機制&#xff1a;核心功能&#xff1a;清晰定義主控權歸屬邏輯&#xff08;默認為學員&#xff0c;但教練隨時可接管&#xff09;。切換方式&#xff1a;通常通過教練遙控器上的物理開關&#xff08;瞬時或鎖定型&#xff09;或軟件按鈕觸發。切換邏輯…

【跨服務器的數據自動化下載--安裝公鑰,免密下載】

跨服務器的數據自動化下載功能介紹&#xff1a;上代碼&#xff1a;發現好久沒寫csdn了&#xff0c;說多了都是淚~~ 以后會更新一些自動化工作的腳本or 小tricks&#xff0c;歡迎交流。分享一個最近在業務上寫的較為實用的自動化腳本&#xff0c;可以批量從遠端服務器下載指定數…

C++-->stl: list的使用

前言list的認識list是可以在固定時間&#xff08;O&#xff08;1&#xff09;&#xff09;內在任意位置進行插入和刪除的序列式容器&#xff0c;并且該容器可以前后雙向迭代。 2. list的底層是雙向鏈表結構&#xff0c;雙向鏈表中每個元素存儲在互不相關的獨立節點中&#xff0…

本地WSL部署接入 whisper + ollama qwen3:14b 總結字幕

1. 實現功能 M4-1 接入 whisper ollama qwen3:14b 總結字幕 自動下載視頻元數據如果有字幕&#xff0c;只下載字幕使用 ollama 的 qwen3:14b 對字幕內容進行總結 2.運行效果 source /root/anaconda3/bin/activate ytdlp &#x1f50d; 正在提取視頻元數據… &#x1f4dd; 正在…

《Linux運維總結:Shell腳本高級特性之變量間接調用》

總結&#xff1a;整理不易&#xff0c;如果對你有幫助&#xff0c;可否點贊關注一下&#xff1f; 更多詳細內容請參考&#xff1a;Linux運維實戰總結 一、變量間接調用 在Shell腳本中&#xff0c;變量間接調用是一種高級特性&#xff0c;它允許你通過另一個變量的值來動態地訪問…

ABP VNext + Akka.NET:高并發處理與分布式計算

ABP VNext Akka.NET&#xff1a;高并發處理與分布式計算 &#x1f680; 用 Actor 模型把高并發寫入“分片→串行化”&#xff0c;把鎖與競態壓力轉回到代碼層面的可控順序處理&#xff1b;依托 Cluster.Sharding 橫向擴容&#xff0c;Persistence 宕機可恢復&#xff0c;Strea…

[激光原理與應用-250]:理論 - 幾何光學 - 透鏡成像的優缺點,以及如克服缺點

透鏡成像是光學系統中應用最廣泛的技術&#xff0c;其通過折射原理將物體信息轉換為圖像&#xff0c;但存在像差、環境敏感等固有缺陷。以下是透鏡成像的優缺點及針對性改進方案&#xff1a;一、透鏡成像的核心優點高效集光能力透鏡通過曲面設計將分散光線聚焦到一點&#xff0…