Zynq学习笔记基本设计流程.docx
《Zynq学习笔记基本设计流程.docx》由会员分享,可在线阅读,更多相关《Zynq学习笔记基本设计流程.docx(14页珍藏版)》请在冰点文库上搜索。
Zynq学习笔记基本设计流程
Zynq学习笔记(基本设计流程)
ZynqStandalonetraining
1.从“所有程序\xilinxDesignTools\Vivado2013.2\启动Vivado2013.2,创建新工程:
LED_Controller,RTLProject,verilog,选择part:
family:
Zynq-7000;package:
clg484.(XC7Z020-1CLG484C)
2.点击FlowNavigator/IPIntegrator/CreateBlockDesign,建立一个Zynq的框图设计。
设计名为System
3.在框图的上方处,点击AddIP,(可以在Search中加7过滤),选ZYNQ7ProcessingSystem;
4.双击ZYNQ7ProcessingSystemIP模块,打开PS的配置窗口。
●配置PS的bank电平,bank0:
LVCMOS3.3V,bank1:
LVCMOS1.8V
●打开MemoryInterfaces,配置QSPI。
1-6,8(FeedbackClk)。
点“+”可以看配置后的各个参数。
●点击I/OPeripherals,配置UART1:
MIO48..49,BaudRate配置在PS-PLConfiguratin中。
●勾选USB0,28-39
●勾选Ethernet0,改EMIO为MIO:
16-27,打开“+”,勾选MDIO:
52-53
●添加SD040-45,CD:
47,WP:
46
●点开GPIO,勾选GPIOMIO,设置MIO的Direction:
50-51为输入,MIO7只能是输出,其余为输入输出。
若看不到,就向右拉移动条。
5.配置PS时钟:
CLKIN=33.3333(常用的)。
CPU=666.6666;DDR_CLK=533.333.
CPUClockRatio=6:
2:
1,均为默认值。
设置外设时钟。
QSPI的模块内部有一个2分配的电路,应此想设置他的工作频率为100M,就需要将输入时钟设为200MHz。
SDIO(即SD卡的时钟),设为50MHz。
Ether0:
1000MHz。
PL时钟:
勾选FCLK_CLK0时钟并设置相应的时钟:
100MHz。
6.配置DDR。
EnableDDR(打勾)。
DDR3,MT41J128M16HA-15E,32BIT(两片拼接而成),InternalVref打勾;填写Train/BoardDetail,两种方式:
一用户直接写;二通过计算。
选择“计算”方式,然后点OK,填写各组信号线在PCB板上的实际长度和Package的数值,相应的Delay参数就计算好了。
7.在输出DDR上右击设为MakeExternal。
将PS上的固定IO脚引到FPGA的外面。
8.在输出FIXED上右击设为MakeExternal。
将PS上的固定IO脚引到FPGA的外面。
9.在system的空白处右击,AddIP…,添加AXIGPIO,设置为ALLOutput。
点击RunConnectionAutomation自动连线GPIO的S-AXI。
10.在GPIO的脚右击选择MakeExternal。
选择输出端口gpio,Ctrl+E,打开ExternalInterfaceProperties,修改端口的Name为LED_DutyCycle。
(也可以在BlockDesign中右击,选择CreateInterfacePort,产生一个输出端口,然后连接。
)
11.产生时钟输出端口。
右击:
CreatePort,鼠标移动到端口上,出现铅笔,连接FCLK_CLK0.
12.其它信号保持默认。
13.使用tools中的ValidateDesign检验设计是否合理。
不合理就会报错,一般是连线不对,需要调整连线。
14.可以使用重新布局按钮,自动将IP放置整齐。
输出时钟脚可以通过生产的Port来连接。
15.在Source中右击CreateHDLWrapper。
16.添加预先写好的PWM_Controller.v到工程的源文件下。
17.连接到PWM_Controller到CPU上,并修改LED_DutyCycle_tri_o,FCLK_CLK_0为内部连线.
PWM_Controllerpwm1(
.Clk(FCLK_CLK_0),
.DutyCycle(LED_DutyCycle_tri_o),
.PWM_out(LEDS)
);
根据verilog的语法要求,屏蔽以下语句:
//FPGA_CLK_0,
//LED_DutyCycle_tri_o,
//outputFPGA_CLK_0;
//output[31:
0]LED_DutyCycle_tri_o;
18.添加输出端口:
LEDS。
LEDS,
output[7:
0]LEDS;
19.保存文件。
20.综合。
点击RunAnalysis。
综合完成后,点击“OpenSynthesizedDesign”,打开综合后的网表设计,准备分配引脚。
21.选择菜单“Layout”/IOPlanning,在右下部的I/OPort找到LEDS,打开选择LEDS[7]并设置Site=U14,依次设置其他LEDS的引脚。
LEDS[0:
7]=T22,T21,U22,U21,V22,W22,U19,U14.
在LEDS的I/OStd上,修改IO标准LVCOS3.3:
LVCMOS33*。
File\SaveConstraints,保存文件为top.xdc。
在Sourse\Constraints\constrs_1下可以看到。
22.Synthesis、Implementation、GenerateBitstream。
同时选择“OpenImplementDesign”。
23.File/Export/ExporthardwaretoSDK…,选择“LaunchSDK”。
24.在SDK中,建立板级支持包。
(也可以和应用工程一起建立)。
25.(红色选做)建立ApplicationProject应用程序helloworld。
26.建立Jtag配置(USB),ProgramFPGA.然后才能下载程序进行调试。
27.然后,RUN/Debug。
开始软件设计
1.在SDK中创建应用工程。
File\New\ApplicationProject,工程名:
LED_Dimmer,使用已有的板级支持包,Next,模板:
空工程。
2.建立一个main.c源文件。
File/New/SourceFile。
此时会有错误,但正确编辑main.c文件后错误会消失。
3.下面是main.c的具体设计步骤,附件为完整的程序,可以拷贝以节省时间。
4.点击system.mss,可以找到外设的驱动和例程,axi_gpio_1,Examples(点击);打开xgpio_example.c。
5.在main.c中从xgpio_example.c中拷贝并添加两个头文件。
#include"xparameters.h";#include"xgpio.h"
6.定义GPIO的ID号:
#defineGPIO_EXAMPLE_DEVICE_IDXPAR_AXI_GPIO_1_DEVICE_ID
在Parameter.h上用F3可以查到GPIO的ID为XPAR_AXI_GPIO_1_DEVICE_ID。
7.GPIO有两个通道,定义使用第一个。
#defineLED_CHANNEL1
8.例化驱动或定义驱动的句柄:
XGpioGpio;
9.GPIO初始化:
Status=XGpio_Initialize(&Gpio,GPIO_EXAMPLE_DEVICE_ID);
10.设置GPIO的方向为输出。
XGpio_SetDataDirection(&Gpio,LED_CHANNEL,0);
11.往GPIO写0,灭灯。
XGpio_DiscreteWrite(&Gpio,LED_CHANNEL,0);
12.等待键盘输入数据函数(1-9)。
value=inbyte();
13.转换成周期,体现为灯的亮度。
周期越小灯越亮。
period=value-0x30;
brightness=period*110000;
14.通过GPIO写周期数控制灯的亮度。
XGpio_DiscreteWrite(&Gpio,LED_CHANNEL,brightness);
15.此时在standalone_bsp_0中一直有一个红色的错误,可以采用Project\Clean…=>Project\BuildAll的方法消除。
16.ProgramFPGA。
17.进入软件调试环境Debug软件程序。
或RunAs….
18.测试。
打开串口调试助手(不能使用SDK的Terminal),利用键盘,输入0-9的数字。
0关灯,1-9越来越亮。
【上电启动的配置】Lab8
1.利用FSBL模板建立FSBL的boot程序。
2.使用XilinxTools/CreateZynqBootImage命令建立镜像文件。
首先在FSBLelf的Browse中选择Boot.elf,该文件会自动添加到下边的文件列表中。
然后添加Bitstream,在hw下;再添加LED_Dimmer.elf文件。
三者的顺序不能颠倒。
最后Create。
3.使用xilinx-tool/ProgramFlash.选择qspisingle,offset可以不填写内容。
Program.
4.设置boot模式。
输入0,1-9测试
5.将LED_Dimmer.BIN文件名字改为BOOT.BIN(后缀不用修改),再拷贝到SD卡中,并插入Zedboard。
6.设置boot模式。
7.上电。
输入0,1-9测试
附件:
/*
*main.c
*
*Createdon:
2013-7-23
*Author:
910704
*/
/*
*main.c
*
*Createdon:
2013-7-23
*Author:
910704
*/
#include"xparameters.h"
#include"xgpio.h"
#defineGPIO_EXAMPLE_DEVICE_IDXPAR_GPIO_0_DEVICE_ID
#defineLED_CHANNEL1
#ifdefPRE_2_00A_APPLICATION
#defineXGpio_SetDataDirection(InstancePtr,DirectionMask)\
XGpio_SetDataDirection(InstancePtr,LED_CHANNEL,DirectionMask)
#defineXGpio_DiscreteRead(InstancePtr)\
XGpio_DiscreteRead(InstancePtr,LED_CHANNEL)
#defineXGpio_DiscreteWrite(InstancePtr,Mask)\
XGpio_DiscreteWrite(InstancePtr,LED_CHANNEL,Mask)
#defineXGpio_DiscreteSet(InstancePtr,Mask)\
XGpio_DiscreteSet(InstancePtr,LED_CHANNEL,Mask)
#endif
XGpioGpio;
main(){
u32Status;
u32value=0;
u32period=0;
u32brightness=0;
print("begindebugprogram\n\r");
/*
*InitializetheGPIOdriver
*/
Status=XGpio_Initialize(&Gpio,GPIO_EXAMPLE_DEVICE_ID);
xil_printf("Status=%d\n\r",Status);
XGpio_SetDataDirection(&Gpio,LED_CHANNEL,0);
print("XGpio_SetDataDirection\n\r");
XGpio_DiscreteWrite(&Gpio,LED_CHANNEL,0);
print("ledsno\n\r");
while
(1){
print("SelectaBrightnessbetween0and9\n\r");
value=inbyte();
period=value-0x30;
xil_printf("BrightnessLevel%dselected\n\r",period);
//SincetheLEDwidthis1e6clkcycles,weneedtonormalize
//theperiodtothatclk.Sinceweacceptvalues0-9,thatwill
//scaleperiodfrom0-999,000.0turnsoffLEDs,999,000isfull
//brightness
brightness=period*110000;
//Writetheduty_cyclewidth(Period)outtothePLGPIOperipheral
XGpio_DiscreteWrite(&Gpio,LED_CHANNEL,brightness);
}
returnXST_SUCCESS;
}
//Verilog模块
modulePWM_Controller(
inputClk,
input[31:
0]DutyCycle,
output[7:
0]PWM_out
);
//SetsPWMPeriod.Mustbecalculatedvs.inputclkperiod.
//Forexample,settingthisto20willdividetheinputclockby2^20,or1Million.
//Soa50MHzinputclockwillbedividedby1e6,thusthiswillhaveaperiodof1/50
parameterperiod=20;
reg[period-1:
0]count;
reg[7:
0]PWM_out;
always@(posedgeClk)
count<=count+1;
always@(Clk)
if(countPWM_out<=8'hFF;
else
PWM_out<=8'h00;
endmodule