Xilinx Vivado zynq7000提高笔记.docx
- 文档编号:9560255
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:21
- 大小:516.45KB
Xilinx Vivado zynq7000提高笔记.docx
《Xilinx Vivado zynq7000提高笔记.docx》由会员分享,可在线阅读,更多相关《Xilinx Vivado zynq7000提高笔记.docx(21页珍藏版)》请在冰豆网上搜索。
XilinxVivadozynq7000提高笔记
1.Modelsim仿真
1.添加modelsim路径:
Tool>options>
2.安装编译仿真库
使用modelSIm需要xilinxlibrary被编译。
运行1:
report_property[current_project]
运行2:
TclCommand
compile_simlib-help
compile_simlib-simulatormodelsim或
compile_simlib-simulatormodelsim-archall-languageall
或
运行3:
安装modelsim库到指定目录
compile_simlib-directoryD:
/modeltech64_10.1c/Xilinx_lib-simulatormodelsim
3.Modelsim中添加xilinx安装的modelsim库目录:
在编译完成库后,生成了一个modelsim.ini文件。
用记事本打开复制其安装目录信息到modelsim安装目录中modelsim自己的modelsim.ini文件中。
(需要去掉modesim.ini的只读特性)重启modelsim,库自动添加到软件中。
4.测试:
modelsim10.1cse
行为层:
通过
综合层:
时序仿真,测试通过
功能仿真,测试通过
应用层:
时序仿真,测试通过
功能仿真,测试通过
使用vivado仿真工具更方便快捷
5.Modelsim工程中添加仿真库的命令
voptzynq.tb_simulator_all+acc-ozz1-Lsimprims_ver-Lunisims_ver-Lxilinxcorelib_verglbl
仿真预编译为库名zynq.tb_simulator_all(后缀tb_simulator_all为仿真testbench文件),添加simprims_ver、unisims_ver、xilinxcorelib_ver、glbl库即可。
如提示不能编译的IP核,需将IP核生成的仿真文件加入工程。
2.DesignCheckpoint
设计检查点(DCP):
是指磁盘上保留存储器内设计准确表示的文件,可在每个步骤后(综合后、优化后、布局后)存储。
可将检查点读回到Vivado工具中,用以恢复设计状态。
文件格式:
.dcp
文件的产生:
.dcp:
工程synthesis后自动产生,在.runs\synth_1目录。
opt.dcp,placed.dcp,routed.dcp:
在工程implementation后自动产生,在.runs\impl_1目录。
作用:
用于存储网表或布线。
如文件,
z_system_wrapper.dcp
z_system_wrapper_opt.dcp,
z_system_wrapper_placed.dcp,
z_system_wrapper_routed.dcp
文件的利用:
1.减少综合、布线时间:
每个模块在synthesis后,可以直接添加.dcp文件到工程中,第二次综合时将直接使用该综合后的文件,减少综合时间。
布线dcp也一样。
2.直接替换对应的源程序,如此可防止源程序被泄露,同时该文件以黑箱形式出现,不能查看源程序。
文件的打开:
File>OpenCheckpoint,以网表的形式打开。
3.AXI总线
SpeedWay/zynqHW_2013_3_lab_5_v3.pdf
Pg059-axi-interconnect.pdf
3.1使用AXI总线:
AXIinterconnect逻辑核
注意AXI总线分类:
普通AXI总线:
GPAXI,仅支持32bits长度,低速,单向(有主从之分)
高速AXI总线:
HPAXI,32bits、64bits,高速,双向(没有主从之分)
AXIinterconnect包含了多个LogiCOREIP。
协议兼容性,可以被配置为支持AXI3,AXI4,AXI4-Lite
接口数据宽度:
AXI4和AXI3宽度:
32,64,128,256,512,1024bits
AXI4-Lite宽度:
32or64bits
接口地址宽度:
可达到64bits
支持只读、只写,以减少资源的使用。
功能:
1)AXICrossbar(交叉开关矩阵或纵横式交换矩阵)
每一个AXICrossbar实例都包含了一个AXICrossbar结构,但Crossbar不能直接被例化到没有AXIInterconnect的设计当中。
2)WidthConversion
每一个在AXIInterconnect核的SI和MI都可以被单独配置为一个数据宽度32,64,128,256,512,1024bits。
当接口的数据宽度与交换开关矩阵的数据不同时,这个WidthConversion模块会自动地根据路径实例化通路。
当设置不同宽度时,AXIInterconnect核可以通过多个SI时隙路径同时兼容收发数据包。
3)时钟转换
当使用同步转换机制时,必须使用同样的时钟源,在时钟转换核当中,所有的时钟域都会被同步化。
当使用异步模式时,所有的时钟域交叉会被运行在FIFO核当中。
这样读写时钟域可以异步。
4)ProtocolConversion
每一个SI和MI在AXIInterconnect当中的都可以被独立配置为AXI4,AXI3或AXI4-Lite协议,当协议接口被配置时,AXIProtocolConverter核自动在路径上实现。
5)AXIRegisterSlices
可以选择插入AXI寄存器。
可以打破关键的时间路径获得更高的时钟频率。
对于每一个RegisterSlice,你可以选择性地在任意AXI通道中使能流水线。
将会引入一个时钟周期的延时。
两种模式使用AXIRegisterSlices
FULLY_REFISTERED:
使用了2级深度的FIFObuffer来实现。
LIGHT_WEIGHT:
简单使用一级流水线寄存器来实现。
6)AXIDataFIFO
可选择插入AXIDataFIFO核心来提供数据buffer以获得更高的数据传输率。
对于每一个FIFO实例,你可以选择使能写通道或读通道或两者都使用buffer。
AXIDataFIFO不支持缓存AXI4-Lite协议。
对于缓存,在AXI4-Lite下不支持FIFO,支持RegisterSlices
3.2PL:
配置AXIinterconnect
(1)32bGPAXIMasterPorts,选择MAXIGP0Interface
(2)选择ClockConfiguration,使能FCLK_CLK0,设置为50MHz
(3)选择PS-PLConfiguration,在General的时钟复位中使能FCLK_RESET0_N
(4)添加IP核,axi_interconnect,并连接
(注意M00_AXI端口,需要打开进行协议设置和位宽、时钟设置)
(5)配置AXI地址,AddressEditer—>AutoAssignAddress
(6)使用axi4lite2abus_v1_0_AXI.v
最多只使用了2级触发器,接口转换。
将AXI总线简化为仅有数据、地址和使能信号,axi-4lite协议。
处理器作为Master对总线进行读与写。
此时PL完全被动。
如需通知处理器读取数据,需要PL部分加入中断。
(7)CPU中断
3.3PS:
访问AXIinterconnect
PS部分查找AXI接口:
1)AXI访问地址确认
访问地址查看PL对AXI的配置(3.2.5)
AXI1接口地址:
p_send_1=(long*)0x43c10000;
AXIO接口地址:
p_send_0=(long*)0x43c00000;
2)SDK下访问:
a.声明地址:
staticlong*p_send0=(long*)0x43c00000;
staticlong*p_send1=(long*)0x43c00004;
注意地址必须是4的倍数,是否默认值为8位需要留出4个8bits作32bits。
当p_send0+1时,按32位地址进行计算,因地址已经占用4byts,所以加1的结果为地址0x43c00004。
即:
p_send0+1=43c10004!
=43c10001。
即:
32bit的子帧加1值为4,32bits的常数加1值为1
b.写AXI,直接向地址进行赋值:
*p_send0=0xAAAAAAAA;
*p_send1=0x55555555;
C.读AXI,直接从对应地址读出数据
地址必须为4的倍数,
D.读写参考axi_bram_ctrl_0的例程文件
从bsp库中调用库函数:
#include"xil_io.h"
读AXI总线:
u32Xil_In32(u32Addr)
{
return*(volatileu32*)Addr;
}
写AXI总线:
voidXil_Out32(u32OutAddress,u32Value)
{
*(volatileu32*)OutAddress=Value;
}
问题:
1.处理器读AXI死机,是在等候PL响应。
时序问题。
(Bd文件中,M00_AXI端口设置需要配置为AXI4lite协议)
2.处理器只能读得1bit?
toAXI_bus:
3
fromAXI_bus:
reg43C00008=1
toAXI_bus:
4
fromAXI_bus:
reg43C0000C=0
toAXI_bus:
5
fromAXI_bus:
reg43C00010=1
toAXI_bus:
6
fromAXI_bus:
reg43C00014=0
未知原因?
建议使用例程。
在例程中重新建立ARM_system,和AXI总线,同样的程序,能够正常运行。
测试工程:
Note/zynq_test/AXI_BUS_TEST.rar
4.双CPU工作
4.1建立工程
为双CPU分别建立BoardSupportPackage
Standalone_bsp_cpu0
Standalone_bsp_cpu1
分别在package工程上建立应用工程
Hello_cpu0
Hello_cpu1
4.2双处理器同时在线调试DEBUG
选择配置选项Run>debugConfiguration的DeviceInitialization选项卡的ResetType选项,将ResetEntireSystem改为ResetProcessorOnly。
注:
SDK2013.4下,在不烧写PL配置程序下可直接下载程序,cpu0,cpu1按先后顺序在线运行后,不需任何唤醒设置,即可同时运行。
SDK2013.4同时调试。
Help中搜索Multi-Processor,查看多核处理器的调试,如图所示。
Step1:
选择配置。
Step2:
配置软件。
选择处理器,分别勾选各自的下载程序,点击Debug即开始调试。
SDK2014.4同时调试,可能cpu1的运行必须由cpu0激活。
4.3在地址分配,或根据程序大小分配:
从应用工程下的lscript.ld文件,更改hello_cpu0与hello_cpu1的DDR地址,其它不变。
cpu0
ps7_ddr_0_S_AXI_BASEADDRbaseaddress(0x00100000)size(0x00100000)
cpu1
ps7_ddr_0_S_AXI_BASEADDRbaseaddress(0x00200000)size(0x00100000)
DownloadingProgram--F:
/zynq_work/zynq_test/AXI_project_1/project_1.sdk/hello_cpu1/Debug/hello_cpu1.elf
section,.text:
0x00200000-0x0020170b
section,.init:
0x0020170c-0x00201723
section,.fini:
0x00201724-0x0020173b
4.4在cpu0中添加激活程序。
第一步:
DisableCacheonOCM
使用函数:
Xil_SetTlbAttributes(0xFFFF0000,0x14de2);
第二步:
载入CPU1程序的存储地址到CPU1处理器的入口地址:
*(unsignedint*)(0xFFFFFFF0)=(unsignedint)0x200000;
第三步:
cpu0发出唤醒命令,唤醒cpu1
print("CPU0:
sendingtheSEVtowakeupCPU1\n\r");
sev();
需要定义:
#definesev()__asm__("sev")
在SDK2014.1下在线运行cpu1,然后再在线运行cpu0,同时工作起来。
注意顺序不能颠倒,否则不能唤醒cpu1.
同时在线运行:
运行cpu1时,软件runconfiguration中,需要设置处理器0,否则软件报错不能在线运行。
不影响硬件的双CPU同时工作。
4.5实际运行验证
按加密启动方式生成镜像文件。
使用RSA加密镜像。
the_ROM_image:
{
[pskfile]F:
\zynq_work\zynq_key_test\key_tool\rsa_zedboard\psk.pk1
[sskfile]F:
\zynq_work\zynq_key_test\key_tool\rsa_zedboard\ssk.pk1
[bootloader,authentication=rsa]F:
\zynq_work\zynq_key_test\key_tool\rsa_zedboard\ready_for_download\fsbl_rsa_debug.elf
F:
\zynq_work\zynq_key_test\key_tool\rsa_zedboard\ready_for_download\hello_cpu0.elf
F:
\zynq_work\zynq_key_test\key_tool\rsa_zedboard\ready_for_download\hello_cpu1.elf
}
RSA镜像下载到QSPI:
XMDConsole
1.cdF:
/zynq_work/zynq_key_test/key_tool/rsa_zedboard/ready_for_download
2.connectarmhw
3.sourceps7_init.tcl
4.ps7_init
5.dowu-boot.elf
6.con
7.stop
8.dow-datacpu2_rsa_boot0.bin0x2000000;0x2000000是DDR中20M的位置,将认证文件下载到DDR的20M(0x2000000)处。
9.con
COM终端
程序已下载到DDR中,通过串口终端对ARM的u-boot进行操作,使DDR中的程序写到QSPI中。
1.sfprobe0;获得QSPI的操作对象
2.sferase00x800000;对QSPI从0开始擦除8M的长度。
3.sfwrite0x20000000x80000x600000;将DDR的20M开始的,长度为6M(0x600000)的内容写入32K(0x8000)开始的QSPI中,即将认证文件写入QSPI。
重启后,同时正常工作。
工程:
Note/zynq_test/SDK2014_CPU2work.rar
5.FSBL配置
1)FSBL启动文件具有通用性,与PL、PS的配置变化没直接关系。
2)FSBL如需使启动的文件支持RSA加密,需要添加变量常数:
RSA_SUPPORT
Properties>C/C++Build>Setting>symbols>添加
3)测试启动时间常数:
FSBL_PERF
4)其它参数配置:
查看fsbl.h中的说明
FSBL_DEBUG_GENERAL/*generaldebugmessages*/
FSBL_DEBUG_INFO/*Moredebuginformation*/
DEBUG
RSA_SUPPORT
6.SDK技巧
SDK软件工程的直接运行:
SDK软件工程可在未下载bit文件的情况下,直接运行软件工程,或仅下载SDK软件程序,也能直接正常运行。
原因:
Ps7处理器初始化,从vivado导出hw_platform后,该文件夹生成的ps7_init.tcl文件可以对处理器进行初始化。
如果未下载FPGA的bit文件时,在该硬件平台生成的软件可直接运行在处理器上,此时处理器的MIO口的配置,全依赖于ps7_init.tcl文件。
此时zynq7在没有bit文件下,完全用作ARM处理器。
ARM处理器的配置情况:
查看hw_platform_0/ps7_init.html文件
驱动情况:
查看文件bsp/system.mss
7.SDK_ps7全局计时器的使用
程序:
全局时钟头文件xtime_l.c/h
定义:
计数器计数频率为内核主频/2
#defineCOUNTS_PER_SECOND(XPAR_CPU_CORTEXA9_CORE_CLOCK_FREQ_HZ/2),
参考1:
FSBL的FSBL_PERF时间常数设置。
参考2:
sleep()函数
函数:
XTime_SetTime(XTimeXtime)一般不设置。
复位、写时间值到全局时钟计数器寄存器。
多处理器下,任意一处理器使用该函数,将复位所有处理器。
XTime_GetTime(XTime*Xtime)获取当前时钟计数器值
实例1:
秒延时文件sleep.c
#include"sleep.h"
#include"xtime_l.h"
#include"xparameters.h"
intsleep(unsignedintseconds)
{XTimetEnd,tCur;
XTime_GetTime(&tCur);
tEnd=tCur+((XTime)seconds)*COUNTS_PER_SECOND;
do{XTime_GetTime(&tCur);
}while(tCur return0; } 实例2: 时间测量函数fsbl/main.c #include"xtime_l.h" XTimetCur=0; XTime_GetTime(&tCur); XTimetEnd=0; FsblMeasurePerfTime(tCur,tEnd); voidFsblMeasurePerfTime(XTimetCur,XTimetEnd) {doubletDiff=0.0; doubletPerfSeconds; XTime_GetTime(&tEnd); tDiff=(double)tEnd-(double)tCur; /**ConverttPerfintoSeconds*/ tPerfSeconds=tDiff/COUNTS_PER_SECOND; /**ConverttPerfintoSeconds*/ tPerfSeconds=tDiff/COUNTS_PER_SECOND; printf("%fseconds\r\n",tPerfSeconds); } 8.封装IP 8.1在工程中添加源程序(addsources),可添加外部IP (ConfigurableIP,DSPcomposite,embeddedsub-design) 格式: .xco.xci.mdl.slx.bd 8.2创建IP轮廓(IPDefinition) 选择Tools-->CreateAndPackageNewIP。 如需将当前工程封装为IP,选择封装当前工程,点击finish将把整个工程生成对应IPDefinition。 如需将其他文件封装为IP,选择程序文件目录,点击finish将在指定的目录建立IPDefinition,并自动为IP新建一个工程。 8.3封装IP 在FlowNavigator的ProjectManager中选择PackageIP。 然后可在PackageIP中设置IP名,查看使用的文件等,最后点击最后一项的PackageIP按钮,将产生封装好的IP。 8.4查看生成的IP 在IPIntegrator中创建IP模块文件,bd文件 添加生成的IP文件 双击IP后产生配置说明,该模块中可以定义位宽。 可以定义位宽是因为在verilog程序中定义了常量parameter。 8.5生成IP文件 在.runs\synth_1目录生成黑箱文件(checkpointfile): axi4lite_reg_if_v1_0.dcp 该文件可以作源文件如HDL文件一样添加和使用。 在.srcs\sources_1\bd\z_system\ip\z_system_axi4lite_reg_if_v1_0_0_0目录查找到 IP文件: z_system_axi4lite_reg_if_v1_0_0_0.xci 该目录是新建bd文件后,在z_system.bd中添加生成的IP而产生。 9.数学库的使用 添加数学库函数: C/C++Build>setting>ARMgcclinker>libraries>添加库“m” 头文件中加入 10. 附录: Axi4lite总线协议: moduleaxi4lite2abus_v1_0# ( //Userstoaddparametershere //Userparametersends //Donotmodifytheparametersbeyondthisline //ParametersofAxiSlaveBusInterfaceS00_AXI parameterintegerC_S00_AXI_DATA_WIDTH=32, parameterintegerC_S00_AXI_ADDR_WIDTH=24 ) ( //Userstoaddportshere outputBUS2IP_RDn, output[C_S00_AXI_ADDR_WIDTH-1: 0]BUS2IP_RDADDR, input[C_S00_AXI_DATA_WIDTH-1: 0]I
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Xilinx Vivado zynq7000提高笔记 zynq7000 提高 笔记
![提示](https://static.bdocx.com/images/bang_tan.gif)