1. 程式人生 > >自定義IP--轉載我之前的blog的內容

自定義IP--轉載我之前的blog的內容

1,Xilinx官方為大家提供了很多IP核,用ZYNQ系統設計IP核,最常用的就是使用AXI匯流排將PS同PL部分的IP核連線起來。

介面是Slave,資料寬度是32位,IP內部的暫存器數量為4個。這樣就可以生成一個AXI讀寫協議的Verilog程式碼,主要內容就是對4的暫存器進行讀寫。然後在裡面對ip埠的資料進行通訊。哪些暫存器配置為只讀,只寫,可讀寫模式。

把一些PL端與外部連線的引腳加入,形成AXI介面的IP掛載ZYNQ的AXI總線上。

然後生成對應的硬體位元流,然後就發現RTC的IP對映到ZYNQ的記憶體空間上,也會生成對應的一些讀寫API的驅動函式。

#define RTC_IP_mReadReg(BaseAddress, RegOffset) \
Xil_In32((BaseAddress) + (RegOffset))

#define RTC_IP_mWriteReg(BaseAddress, RegOffset, Data) \
  		Xil_Out32((BaseAddress) + (RegOffset), (u32)(Data)) 實際上就是對gpio操作。

總結:既要理解底層的pl的邏輯時序,又要會使用API​​函式,比如歷程程式碼:

RTC_IP_mWriteReg (RTC_BASEADDR, 12, 0x00160A0A);

    //Write RTC Register3, Setting time, hour=12, month=00, date=00
	RTC_IP_mWriteReg (RTC_BASEADDR, 8, 0x000C0000);

    //Write RTC Register3, enable time setting
	RTC_IP_mWriteReg (RTC_BASEADDR, 12, 0x80160A0A);

    for (Delay = 0; Delay < 10000000; Delay++);

    //Write RTC Register1, enable time setting

	RTC_IP_mWriteReg (RTC_BASEADDR, 12, 0x00160A0A);//為了使能讀有效,並沒有生效,什麼原因?只有去看FPGA程式碼部分

Verilog的:

if( Time_set_en==1'b1 ) begin  i <= i + 1'b1; end			
		else begin i <= 4'd8; end

所以最後這個寫暫存器函式就是為了把Time_set_en訊號拉低。