版本:vivado 2018.3
vivado 自定義封裝ip核,可以將ip核封裝成帶AXI總線,也可將ip核封裝成不帶AXI總線。
本次設(shè)計(jì)介紹,如何將當(dāng)前工程封裝成ip核(不帶AXI總線)
目錄
一、工程文件介紹
二、封裝IP核步驟
三、將IP核添加到ip核庫?
一、工程文件介紹
1. 創(chuàng)建如下的工程:
2. 工程內(nèi)的.v文件如下:
module uart_rx
#(
parameter integer BPS = 9_600 , //發(fā)送波特率
parameter integer CLK_FRE = 50_000_000 //輸入時鐘頻率
)
(
//系統(tǒng)接口
input sys_clk , //50M系統(tǒng)時鐘
input sys_rst_n , //系統(tǒng)復(fù)位
//UART接收線
input uart_rxd , //接收數(shù)據(jù)線
//用戶接口
output reg uart_rx_done , //數(shù)據(jù)接收完成標(biāo)志,當(dāng)其為高電平時,代表接收數(shù)據(jù)有效
output reg [7:0] uart_rx_data //接收到的數(shù)據(jù),在uart_rx_done為高電平時有效
);
//param define
localparam integer BPS_CNT = CLK_FRE / BPS; //根據(jù)波特率計(jì)算傳輸每個bit需要多個系統(tǒng)時鐘
//reg define
reg uart_rx_d1 ; //寄存1拍
reg uart_rx_d2 ; //寄存2拍
reg uart_rx_d3 ; //寄存3拍
reg [31:0] clk_cnt ; //計(jì)數(shù)器,用于計(jì)數(shù)發(fā)送一個bit數(shù)據(jù)所需要的時鐘數(shù)
reg [3:0] bit_cnt ; //bit計(jì)數(shù)器,標(biāo)志當(dāng)前發(fā)送了多少個bit
reg rx_en ; //接收標(biāo)志信號,拉高代表接收過程正在進(jìn)行
reg [7:0] uart_rx_data_reg; //接收數(shù)據(jù)寄存
//wire define
wire neg_uart_rxd ; //接收數(shù)據(jù)線的下降沿
assign neg_uart_rxd = uart_rx_d3 & (~uart_rx_d2); //捕獲數(shù)據(jù)線的下降沿,用來標(biāo)志數(shù)據(jù)傳輸開始
//將數(shù)據(jù)線打3拍,作用1:同步不同時鐘域信號,防止亞穩(wěn)態(tài);作用2:捕獲下降沿
always@(posedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n)begin
uart_rx_d1 <= 1'b0;
uart_rx_d2 <= 1'b0;
uart_rx_d3 <= 1'b0;
end
else begin
uart_rx_d1 <= uart_rxd;
uart_rx_d2 <= uart_rx_d1;
uart_rx_d3 <= uart_rx_d2;
end
end
//捕獲到數(shù)據(jù)下降沿(起始位0)后,拉高傳輸開始標(biāo)志位,并在第9個數(shù)據(jù)(終止位)的傳輸過程正中(數(shù)據(jù)比較穩(wěn)定)再將傳輸開始標(biāo)志位拉低,標(biāo)志傳輸結(jié)束
always@(posedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n)
rx_en <= 1'b0;
else begin
if(neg_uart_rxd )
rx_en <= 1'b1;
//接收完第9個數(shù)據(jù)(終止位)將傳輸開始標(biāo)志位拉低,標(biāo)志傳輸結(jié)束,判斷高電平
else if((bit_cnt == 4'd9) && (clk_cnt == BPS_CNT >> 1'b1) && (uart_rx_d3 == 1'b1) )
rx_en <= 1'b0;
else
rx_en <= rx_en;
end
end
//當(dāng)數(shù)據(jù)傳輸?shù)浇K止位時,拉高傳輸完成標(biāo)志位,并將數(shù)據(jù)輸出
always@(posedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n)begin
uart_rx_done <= 1'b0;
uart_rx_data <= 8'd0;
end
//結(jié)束接收后,將接收到的數(shù)據(jù)輸出
else if((bit_cnt == 4'd9) && (clk_cnt == BPS_CNT >> 1'd1) && (uart_rx_d3 == 1'b1))begin
uart_rx_done <= 1'b1; //僅僅拉高一個時鐘周期
uart_rx_data <= uart_rx_data_reg;
end
else begin
uart_rx_done <= 1'b0; //僅僅拉高一個時鐘周期
uart_rx_data <= uart_rx_data;
end
end
//時鐘每計(jì)數(shù)一個BPS_CNT(傳輸一位數(shù)據(jù)所需要的時鐘個數(shù)),即將數(shù)據(jù)計(jì)數(shù)器加1,并清零時鐘計(jì)數(shù)器
always@(posedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n)begin
bit_cnt <= 4'd0;
clk_cnt <= 32'd0;
end
else if(rx_en)begin //在接收狀態(tài)
if(clk_cnt < BPS_CNT - 1'b1)begin //一個bit數(shù)據(jù)沒有接收完
clk_cnt <= clk_cnt + 1'b1; //時鐘計(jì)數(shù)器+1
bit_cnt <= bit_cnt; //bit計(jì)數(shù)器不變
end
else begin //一個bit數(shù)據(jù)接收完了
clk_cnt <= 32'd0; //清空時鐘計(jì)數(shù)器,重新開始計(jì)時
bit_cnt <= bit_cnt + 1'b1; //bit計(jì)數(shù)器+1,表示接收完了一個bit的數(shù)據(jù)
end
end
else begin //不在接收狀態(tài)
bit_cnt <= 4'd0; //清零
clk_cnt <= 32'd0; //清零
end
end
//在每個數(shù)據(jù)的傳輸過程正中(數(shù)據(jù)比較穩(wěn)定)將數(shù)據(jù)線上的數(shù)據(jù)賦值給數(shù)據(jù)寄存器
always@(posedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n)
uart_rx_data_reg <= 8'd0; //復(fù)位無接收數(shù)據(jù)
else if(rx_en) //處于接收狀態(tài)
if(clk_cnt == BPS_CNT >> 1'b1) begin //傳輸過程正中(數(shù)據(jù)比較穩(wěn)定)
case(bit_cnt) //根據(jù)位數(shù)決定接收的內(nèi)容是什么
4'd1:uart_rx_data_reg[0] <= uart_rx_d3; //LSB最低位
4'd2:uart_rx_data_reg[1] <= uart_rx_d3; //
4'd3:uart_rx_data_reg[2] <= uart_rx_d3; //
4'd4:uart_rx_data_reg[3] <= uart_rx_d3; //
4'd5:uart_rx_data_reg[4] <= uart_rx_d3; //
4'd6:uart_rx_data_reg[5] <= uart_rx_d3; //
4'd7:uart_rx_data_reg[6] <= uart_rx_d3; //
4'd8:uart_rx_data_reg[7] <= uart_rx_d3; //MSB最高位
default:; //1和9分別是起始位和終止位,不需要接收
endcase
end
else //數(shù)據(jù)不一定穩(wěn)定就不接收
uart_rx_data_reg <= uart_rx_data_reg;
else
uart_rx_data_reg <= 8'd0; //不處于接收狀態(tài)
end
endmodule
二、封裝IP核步驟
step1: Tools---Great and Package New IP,彈出的界面點(diǎn)擊next
step2:選擇Package your current project,點(diǎn)擊Next
setp3:①選擇 ip核存放的位置? ②勾選“include .xci files” ③點(diǎn)擊next
setp4:彈出一個總結(jié)窗口,點(diǎn)擊Next
setp5:彈出Package ip 界面。如果不小心關(guān)了這個界面,可以在最左邊的“PacgeIP”
?Identification:此界面可以修改ip核的名字、ip核展示的名字等等
Compatibility:增加或者刪除適用于哪些型號的FPGA芯片,一般默認(rèn)
?File Groups :ip核文件類別,可以選擇是否包含 綜合和仿真文件
Customization Parameters:雙擊可配置參數(shù)的名字、默認(rèn)值等等
?Ports and Interfaces:ip核的輸入和輸出端口
Addressing and Memory :ip核的地址,如果PS通過AXI總線訪問PL,PS可通過這個地址識別到這個IP核,可以理解為IP核的ID
?
Customazation GUI : IP核的GUI界面
setp6:Review and Packaga可看到ip核的一些總結(jié)信息,點(diǎn)擊 "Package IP" ,ip核已經(jīng)封裝完成。
?文章來源地址http://www.zghlxwxcb.cn/news/detail-779177.html
?封裝完成ip核后,可以在 ip catelog里面搜到到封裝完成的ip核,如下:
三、將IP核添加到ip核庫?
如果想將封裝好的ip核,在其他的工程里面使用,還需要將ip核文件添加到ip核庫里面。
Settings---IP---Reposilory,選擇ip的文件,點(diǎn)擊ok
?文章來源:http://www.zghlxwxcb.cn/news/detail-779177.html
?
?
?
?
?
?
到了這里,關(guān)于VIVADO 自定義封裝ip核(超詳細(xì))的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!