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