在這篇實例之前,說點自己的兩點感受。
一、這個zynq開發流程基本上是這樣一個節奏:PlanAhead為軟硬件結合的載體,在此可以設計硬件,然后將硬件導出到軟件設計?;玖鞒倘鐖D:
這里三個軟件切換來切換去,極其麻煩,并且其中還可能要FPGA開發用到的ISE,應該不是xilinx想要的結果,預計以后會集成到一個軟件上。
二、剛使用這個平臺不久,碰到bug不少,說明xilinx推出時準備不是很充分。
用戶IPcore與PS交互數據分兩種方案:一種是通過EMIO交換數據,將PL的IP核當做系統外設,性能有所欠缺。
常用的是第二種:滿足AXI協議的IP核。此IPcore與AXI密切相關,難度較高。為降低難度,xilinx提供wizard自動生成axi總線相關代碼,做好地址譯碼邏輯、讀寫控制邏輯,并在工作區生成一些寄存器。用戶PL邏輯通過讀寫這些寄存器與PS交互。
以PWM發生器為例,有兩個寄存器,一個調節周期的寄存器,一個調節占空比。PlanAhead建立工程,添加嵌入式資源進入XPS,添加xml配置之后,進入XPS Hardware —> Create or Import Periphera。開始添加IPcore wizard過程,注意在 IP interface階段,user logic master support表示ip核內部是否要加入master接口,一般用在較復雜外設。software reset和include data phase timer分別為是否開啟軟件中斷和數據周期計時器,在此我們不要這些,防止生成多余的AXImaster接口、復位和計時模塊。下一步選擇寄存器數量,這里我們用到占空比和周期reg,因此設為2。下一步仿真平臺不要,下一步勾選二三項,第一項是生成verilogVHDL,我要VHDL,不選,二表示生成一個ISE工程便于測試和調試IP core。三表示生成軟件驅動庫文件,方便在SDK中使用IP core。完成wizard。
配置完成,接下來添加剛完成的IPcore,在IP catalog中雙擊添加,不用修改ok即可在 bus interface可找到剛添加的pwm_ip_0,右鍵之,view MPD,添加pwm_out接口,1bit的輸出PORT pwm_ou = "", DIR =o這里添加的代碼在systemassembly view中的port映射出添加的pwm_out,
問題:在wizard完成后出現pwm_ip.vhd文件沒有user_logic的component塊。原因:勾選Generate stub ‘user_logic’template in verilog instead of VHDL之后會生成。
右鍵pwm_ip_0,選擇browser HDL sources 選pwm_ip.hdl在component加用戶邏輯user_logic,繼續右鍵pwm_ip_0,選擇browser HDL sources 選user_logic.v添加自己要加的功能,這里我們加pwm發生功能,代碼如下
wire ovprd;//下一個周期開始信號
reg [C_SLV_DEIDTH-1 : 0] pwm_counter;
wire pre_pwm_out;//預輸出信號
always @(posedge Bus2IP_Clk) begin
if(!Bus2IP_Clk || ovprd || ~slv_reg1[31])//時鐘0,下一個周期開始1,占空比reg31位0 計數器復位
pwm_counter = 32'h8000_0000;
else if(slv_reg1[31])
pwm_counter = pwm_counter + 1'b1;
else
pwm_counter = pwm_counter;
end
assign ovprd = (pwm_counter[30 : 0] == slv_reg0[30 : 0])? 1'b1 : 1'b0;
assign pre_pwm_out = (slv_reg1 < pwm_counter)? 1'b0 : 1'b 1;
assign pwm_out = pre_pwm_out & slv_reg1[31];
然后project—>Rescan User Repositories更新,可以在ports中看到新添加的引腳,選擇exteral ports連接管腳。
在Address中右上角Generated Address自動分配地址
Project—> Design Rule Check 沒有錯誤后關閉XPS回到PA
右鍵module_1,create top HDL
add source 選擇添加約束,對應之前的工程名
run synthesis,出現錯誤,如下圖1
重新建程序,更改新建xps工程名以及PA的約束名為system,而不使用module_1默認名,另外一個改動是wizard建立ipcore過程中去掉data phase timer模塊。之后錯誤消失,但是警告如圖2,這個警告是由于約束地址造成,關系不大。
下一步打開open synthesized design(不點開這個在PA界面找不到IO ports標簽)打開IO ports,設置pwm_out的引腳,然后保存(點擊PA的保存標簽會讓你選擇一個ucf文件來保存,不需要自己另外寫)。
Generate Bitstream 然后導出硬件到SDK,新建xilinx cproject,選擇hello world模板。
注意接下來是將自己的pwm_ip導入的過程,跟上一個實驗不一樣的地方。選擇xilinx tools —> Repositories 點擊new 找到工程路徑到edk,ok。右擊hello_world_bsp_0,選擇Board Support Package Setting,找到drivers中的pwm_ip_0,將drive欄目下的generic修改為pwm_ip,自此自設的IP核驅動就已經添加進來了。這里會報錯,這是xilinx的一個bug,在hello_world_bsp_0上有一個紅叉,在pwm_ip_selftest.c中加入#definePWM_IP_USER_NUM_REG_2,添加之后還是報錯,如圖3
注釋掉
添加C代碼
PWM_IP_mWriteReg(XPAR_PWM_IP_0_BASEADDR,0, 10000);
PWM_IP_mWriteReg(XPAR_PWM_IP_0_BASEADDR, 4,0X80000000+5000);//5000/10000=50%
保存報錯'XPAR_PWM_IP_0_BASEADDR'undeclared (first use in this function)
修改后報錯cannot find -lxil(可能是project_1沒有改為對應pwm_ip_test,導致庫文件宏定義之類的不能調用)
發現PWM_IP_USER_NUM_REG 2多寫了個下劃線的錯誤。修改后錯誤依舊,貌似不會重新編譯。因此要重新從PA導出硬件到SDK。
選擇Xilinx Tools->Program FPGA
在hello_world_0工程上右擊,選擇RunAs->Launch on Hardware運行出現各種錯誤,如下圖4、5
換成memorytest模板后,萬用表查看JA1約為1.2V。用示波器看波形結果是正確的。helloworld模板不行,具體原因不明。
總結:
第一、添加user_logic.v時要求為verilog代碼,在wizard過程中嘗試過使用VHDL而不是verilog,結果是生成的pwm_ip.hdl中沒有user_logic的component模塊。而pwm_ip.hdl又是VHDL語言,極其不便。
第二、添加約束時使用默認的module_1文件名,綜合時會出錯,改名為system則通過。
第三、在SDK中添加#define PWM_IP_USER_NUM_REG 2后不會自動編譯進去,需要重新新建 Xilinx CProject才能正常使用。
第四、使用hello world模板會出現不明問題導致RunAs->Launch onHardware出錯,改為memorytest模板正常。
評論
查看更多