EBAZ4205 ZYNQ 通过 PS部分来为PL逻辑提供时钟(没有焊接PL晶振的板子可用此方法)

本文介绍一种通过PS共享时钟的方式 ,为PL提供逻辑时钟的方法,此方法适用于没有焊接PL晶振的ZYNQ板子(例如矿机板EBAZ4205默认也没有这个晶振)

本文将简单的介绍创建过程,完整的PS工程创建可以参考项目6

创建工程

1)新建一个项目,芯片型号选择 XC7Z010CLG400-1

2) 创建一个BLOCK设计,并添加ZYNQ7 PROCESSING SYSTEM模块,软件自动生成了一个 zynq的block 如下图所示,接下来要做一些相应的设置,双击下图中的ZYNQ核

3) 在ZYNQ中设置时钟功能 :

找到 设置项目中的 Clock Configuration 选项, 在PL Fabric Clocks 设置自己需要的时钟频率,这里一共有4种频率可以设置 类似于我们的PLL功能。这里我们设置50M时钟

4) 在zynq中设置DDR功能 :

依次在弹窗里找到DDR Configuration→DDR Controller Configuration→DDR3,在Memory Part下拉菜单中根据自己板子上的DDR来选择相应的DDR3,本实验所用到型号:MT41K128M16JT 125,数据位宽选择16bit 最后点击“OK”,如下图所示。

5)完成上述操作后, 点击“Run Block Automation”如下图所示。在弹出的选项中保持默认,点击“OK”,即可完成对ZYNQ7 Processing System的配置,得到如下所示

6)鼠标选择图上的FCLK_CLK0并与 M_AXI_GP0_ACLK之间连接一根线,来为PS提供时钟

最终得到下图所示

上面已经完成了ZYNQ PS部分的设置,接下来设计自己的PL模块代码和与ZYNQ PS部分连接

7)新建一个.v文件,本文命名为LED_TEST.V, 详细图文创建过程可以参考工程一, LED_TEST.V中的verilog如下所示(工程一中的点灯代码,增加了RST信号)

`timescale 1ns / 1ps
module LED(
     input clk,
     input rst_n,
     output led
 );
 parameter T1MS = 26'd50_000_000 ; //50M晶振时钟
 reg [25:0]time_count;//时钟计数器
 reg led_r;
 always@(posedge clk or negedge rst_n)
     if(!rst_n)begin
        time_count<=26'd0;
        led_r<=1'b0;
     end
     else begin
         if(time_count>=T1MS)begin
             time_count<=26'd0;
             led_r<=~led_r;
         end
         else time_count<=time_count+1'b1;
     end
 assign led=led_r;    
 endmodule

8) 回到block编辑器中Diagram ,右键空白区域,选择增加模块 add module,选择刚才创建的LED_TEST模块,并确认

9)将来自 Zynq 模块输出的CLK 和 RESET信号和我们的LED模块连接,并且通过右键单击端口并选择“Make External”生成led的输出管脚

10)source→Design Source ,右键我们创建的BLOCK工程,点击create HDL wrapper如下图所示。

在弹出的对话框里保持默认

11)在Source 窗口中,创建一个约束文件,增加以下代码来分配LED管脚

set_property PACKAGE_PIN H18 [get_ports led_0]
set_property IOSTANDARD LVCMOS33 [get_ports led_0]

12)完成编译(绿色箭头) 和Generate Bitstream(综合并生成二进制文件) 的操作

以上操作后,硬件PL以及PS的设置和布局已经完成,但是因为时钟是由PS端产生的,PS端的ARM运行时才能给PL提供时钟信号。直接将bit流文件下载到ZYNQ中,PS端并不会工作,也不会输出时钟给PL

想要让PS端工作,就需要在SDK创建一个工程,哪怕是个空工程也可以

以下是创建一个PS空工程的过程,详细的图文教程可以参考项目6

1)vivado中 选File→Export→Export hardware…,在弹出的对话框中勾选“include bitstream”,点击“OK”确认

2)File→Lauch SDK,在弹出的对话框中,保存默认,点击“OK”, 系统将打开SDK工程

3)新建一个工程 file→new→Application Project,来新建一个“Application Project”,在新建工程中输入自己的工程名,并选择Empty Application(空应用)

并且在空应用中创建一个main.c文件

并在里面复制以下代码(相当于创建了个while(1)空循环的程序)

#include "xparameters.h"
#include "xplatform_info.h"

int main(void){
  while(1){
  }
}

然后点保存。

4)用之前生成的二进制文件对FPGA进行编程,Xilinx Tools -> Program FPGA 然后点击 “Program”

5)当FPGA编程成功后,我们需要初始化zynq中的处理器,右键点击刚才创建的空工程,选择Run As -> Launch on Hardware (System Debugger) 或者 Launch on Hardware (GDB).

经过以上操作,可以看到LED灯在有规律的进行闪烁,证明我们的PS已经正常向PL输出时钟了

本文图文部分有所省略,如需详细图文,可以参考

第一个工程 用ZYNQ的PL资源点亮一个LED(完整图文)

第六个工程 用Z第六个工程 用ZYNQ的PS点亮连接到PL端的LED灯(完整图文)

完整工程:

“EBAZ4205 ZYNQ 通过 PS部分来为PL逻辑提供时钟(没有焊接PL晶振的板子可用此方法)”的6个回复

  1. 第六步:6)鼠标选择图上的FCLK_CLK0并与 M_AXI_GP0_ACLK之间连接一根线,来为PS提供时钟,不理解。PS自己有晶振啊

        1. 这个我没发现过,可能PS的时钟配置部分 是在PL的bit文件中就定下了, 可能不需要PS的程序,这部分也能正常启动了, 这两天我有时间验证一下

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注