自定義IP--轉載我之前的blog的內容
阿新 • • 發佈:2018-11-15
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訊號拉低。