本文介绍一种通过PS共享时钟的方式 ,为PL提供逻辑时钟的方法,此方法在工程上比较常用,可以省略一个有源晶振的物料。同样也适用于那些没有PL晶振的ZYNQ主板(如EBAZ4205)
- 此章节内容适用于Smart ZYNQ SP SP2和 SL 版的板子 ( 不包含Smart ZYNQ 标准版 ),如是标准版或本站其他板子请看对应板子目录
- 本文在 vivado2018.3版本上演示
一、创建工程
1)新建一个项目,芯片型号选择 XC7Z020CLG484-1
2) 创建一个BLOCK设计
a.IP INTEGRATOR→Create Block Design,在弹出的对话框中输入设计名,最后点击“OK”,如下图所示
2)在右侧的窗口里 ,点击加号,在选择框里搜索ZYNQ,并找到ZYNQ7 PROCESSING SYSTEM ,双击并打开
3)软件自动生成了一个 zynq的block 如下图所示,接下来要做一些相应的设置,双击下图中的ZYNQ核
4) 在ZYNQ中设置时钟功能 :
找到 设置项目中的 Clock Configuration 选项, 在PL Fabric Clocks 设置自己需要的时钟频率,这里一共有4种频率可以设置 类似于我们的PLL功能。这里我们设置FCLK_CLK0 为50M时钟。(如果你需要其他频率或者更多时钟可以按你的需求进行添加或者修改)。(注意 我们这块板子的输入时钟是33.33M,所以默认设置就好,否则需要修改Input Frequency)
5) 在ZYNQ中设置DDR功能 :依次在弹窗里找到DDR Configuration→DDR Controller Configuration→DDR3,在Memory Part下拉菜单中根据自己板子上的DDR来选择相应的DDR3,本实验所用到型号:MT41K256M16RE-125,数据位宽选择16bit 最后点击“OK”,如下图所示。
5)完成上述操作后, 点击“Run Block Automation”如下图所示
在弹出的选项中保持默认,点击“OK”,即可完成对ZYNQ7 Processing System的配置,得到如下所示
6)右键 FCLK_CLK0右边的线 ,然后点击Make External 将PS的时钟拉出,如下图所示
引出后 如下图所示
7)在FCLK_CLK0与 M_AXI_GP0_ACLK之间连接一根线,来为PS提供时钟(不连接会报错,也可以在ZYNQ设置界面禁用AXI接口,就不用连接了)最终得到下图所示
上面已经完成了ZYNQ PS部分的设置,接下来设计自己的PL模块代码和与ZYNQ PS部分连接
此时可以检查 block design 是否有设计错误 ,如果没有报错 正面设计是正确的
7)创建硬件描述,source→Design Source ,右键我们创建的BLOCK工程,点击create HDL wrapper如下图所示(这一步的作用相当于将图纸转换成对应的硬件描述语言的功能)
在弹出的对话框里保持默认,生成的wrapper文件会自动被设置为顶层
7)新建一个.v文件,本文命名为LED 并且将工程一中的代码 复制过来(具体可以看工程一内容)
复制以下代码到 LED.V中
module LED( input clk, output led ); parameter T1MS = 26'd50_000_000 ; //50M晶振时钟 reg [25:0]time_count=26'd0;//时钟计数器 reg led_r=1'b0; always@(posedge clk) if(time_count>=T1MS)begin time_count<=26'd0; led_r<=~led_r; end else time_count<=time_count+1'b1; assign led=led_r; endmodule
8)现在我们拥有了 时钟(ZYNQ 的PS模块),也拥有了 FPGA的LED模块,接下来要将两个模块结合起来,这里我们可以创建一个顶层TOP.V 模块然后在该顶层模块中例化ZYNQ 和LED模块(创建TOP.v的方式和上面创建LED.V的方式一致)
复制以下代码到 TOP.V
`timescale 1ns / 1ps module TOP( output led ); wire clk; LED u_1( .clk(clk), .led(led) ); ZYNQ_CORE_wrapper u_2( .FCLK_CLK0_0(clk) ); endmodule
仔细观察发现 除了对LED 和ZYNQ 模块进行例化外,代码里还 通过线wire将 led模块的时钟和zynq模块的时钟输出连接在一起了
9) 对程序进行综合
综合后可以看到程序的拓扑结构改变了,TOP变成顶层模块了
10) 在Source 窗口中,创建一个约束文件
打开刚才创建的约束文件
并增加以下代码来分配LED管脚
set_property PACKAGE_PIN P20 [get_ports led] set_property IOSTANDARD LVCMOS33 [get_ports led]
12)完成后点击Generate Bitstream(布线并生成二进制文件) 的操作(会提醒是否保存约束文件,点确认就好)
以上操作后,硬件PL以及PS的设置和布局已经完成,但是因为时钟是由PS端产生的,PS端的ARM运行时才能给PL提供时钟信号。直接将bit流文件下载到ZYNQ中,PS端并不会工作,也不会输出时钟给PL(如果你的主板直接工作了,那么很可能是你的主板设置的是FLASH或者TF启动,并且在上电后PS部分有被启动并初始化过,但是此时ZYNQ输出的时钟可能并不是我们本次试验所设置的50M)
想要让PS端工作,就需要在SDK创建一个工程,哪怕是个空工程也可以
以下是创建一个PS空工程的过程
1)vivado中 选File→Export→Export hardware…,在弹出的对话框中勾选“include bitstream”,点击“OK”确认
勾选“include bitstream”
2)File→Lauch SDK,在弹出的对话框中,保存默认,点击“OK”, 系统将打开SDK工程
3)新建一个工程 file→new→Application Project,来新建一个“Application Project”,在新建工程中输入自己的工程名,并选择Empty Application(空应用)
并且在空应用中创建一个main.c文件
并在里面复制以下代码(相当于创建了个空程序,如果你的PS程序中需要添加其他功能,也按之前的章节进行修改即可)
#include "xparameters.h" #include "xplatform_info.h" int main(void){ return 0; }
然后点保存。
下载到板子上进行验证
1)新创建的工程最好先对Run as 进行配置:右键工程,并点选Run As -> Run Configurations
2) 在弹出的窗口中对Reset entire system 和 Program FPGA两个选项进行勾选操作,这样就不会出现下载程序debug的时候概率性不工作的问题了。(这样操作后系统会自动对FPGA进行配置,不需要按之前工程手动对FPGA进行编程了)
PS如果没有出现下图对话框,可以直接双击左侧的applicationo (System Debugger)。
3)设置好之后,选择Run As
-> Launch on Hardware (System Debugger)
。
经过以上操作,可以看到LED灯在有规律的进行闪烁,证明我们的PS已经正常向PL输出时钟了
- 本文的完整工程下载:16_CLK_PS_TO_PL_TEST
- VIVADO的版本:2018.3
- 工程创建目录:E:\Smart_ZYNQ_SP_SL\SDK\16_CLK_PS_TO_PL_TEST
- 工程适用主板: Smart ZYNQ (SP / SP2 / SL) (不适用于Smart ZYNQ 标准版 )
我的PL烧录进去不用再Run就直接进行闪烁了是为什么呢?
是不用激活嘛
并不是,而是因为你板子FLASH 自带出厂的测试固件, 这个固件默认开机的时候就让ZYNQ核心启动了,PS内部的PLL已经工作了, 如果把固件抹除,或者更换启动方式,再断电启动, 就不会直接闪烁了