ALINX_ZYNQ_MPSoC开发平台FPGA教程:PL的点灯实验

前言

目标 :每秒翻转一次LED


我会在前言中记录自己通过本实验学到的东西

  1. ZYNQ-7000的PL部分使用的时钟是200M的差分时钟,通过有源晶振提供(有源:一上电就产生时钟信号),而PS部分使用的也是有源时钟,但是是50M的单端时钟
  2. 由于PL部分的200M差分时钟,因此需要使用 IBUFDS将差分时钟转为单端时钟,如下图
    在这里插入图片描述

正文

一、点灯设计程序

要实现1秒翻转,就需要一个1秒的计数器,而使用的时钟是200M,那么就是1秒变化200_000_000次,于是计数器计到199_999_999即可翻转灯,并且清零计数器

`timescale 1ns / 1ps 
module led(
//Differential system clock
    input sys_clk_p,
    input sys_clk_n,
    input rst_n,
(* MARK_DEBUG="true" *)    output reg  led
    );
    
(* MARK_DEBUG="true" *)reg[31:0] timer_cnt;
wire sys_clk ;

IBUFDS IBUFDS_inst (//差分输入缓冲器
      .O(sys_clk),   // 1-bit output: Buffer output
      .I(sys_clk_p),   // 1-bit input: Diff_p buffer input (connect directly to top-level port)
      .IB(sys_clk_n)  // 1-bit input: Diff_n buffer input (connect directly to top-level port)
   );

always@(posedge sys_clk)
begin
    if (!rst_n)
    begin
      led <= 1'b0 ;
      timer_cnt <= 32'd0 ;
    end
    else if(timer_cnt >= 32'd199_999_999)   //1 second counter, 200M-1=199_999_999
    begin
        led <= ~led;
        timer_cnt <= 32'd0;
    end
    else
    begin
        led <= led;
        timer_cnt <= timer_cnt + 32'd1;
    end
    
end
//Instantiate ila in source file
//ila ila_inst(
//  .clk(sys_clk),
//  .probe0(timer_cnt),
//  .probe1(led)
//  );

endmodule

二、管脚约束:xdc文件

目的:将 .v 程序中的输入输出端口分配到 FPGA 的真实管脚上
对管脚进行约束,其实就是要得到xdc文件(一个 TCL 脚本)即可,那得到这个xdc文件有2种方式

2.1 管脚约束:方法一

该方法的关键是,打开开发板的用户手册,查询需要约束的输入输出在FPGA上的对应管脚是多少
如,这里是控制PL端的LED,于是查到对应的管脚号为:AE15
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
从下面图中可以看出,图上有3个输入,在管脚约束时只有2个输入约束,这是因为:
在芯片设计时,会将p和n这对差分信号搭配,只要约束了一端,另一个也会被约束,Neg Diff Pair负差分对是sys_clk_n
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.1 管脚约束:方法二

了解tcl脚本语法,自己编写xdc文件
选择“Add or create constraints”选项,点击“Next”——点击“Create File”按钮——在弹出的对话框里选择 File type 是 XDC,“File name”为“led”, 点击 OK 按钮
重点:要明确端口在FPGA所在Bank中的电压值

// 约束引脚号
set_property PACKAGE_PIN AE5 [get_ports sys_clk_p]
set_property PACKAGE_PIN AE14 [get_ports rst_n]
set_property PACKAGE_PIN AE15 [get_ports led]

// 约束电压
set_property IOSTANDARD LVCMOS33 [get_ports led]
set_property IOSTANDARD LVCMOS33 [get_ports rst_n]
set_property IOSTANDARD DIFF_SSTL12 [get_ports sys_clk_p]
XDC 编写的语法

约束引脚号:set_property PACKAGE_PIN " 引脚编号 " [ get_ports “端口名称”]
约束电压: set_property IOSTANDARD " 电平标准 " [ get_ports “端口名称” ]

三、添加时序约束

步骤:点击“Run Synthesis”开始综合——弹出对话框点击“OK”——综合完成以后点击“Cancel”——点击“Constraints Wizard”
在这里插入图片描述
时序约束向导分析出设计中的时钟,这里把“sys_clk_p”频率设置为 200Mhz,然后点击“Skip to Finish”结束时序约束向导
在这里插入图片描述
弹出的窗口中点击“OK”——点击“Finish”——这个时候 led.xdc 文件已经更新,点击“Reload”重新加载文件,并保存文件

四、添加激励文件

首先设计仿真时长:右击 SIMULATION 中 Simulation Settings
在这里插入图片描述
然后将下面的激励代码加入到工程中
注意,只有sys_clk_p是输入赋值,sys_clk_n直接对sys_clk_p取反得到

`timescale 1ns / 1ps
//
// Module Name: vtf_led_test
//

module vtf_led_test;
// Inputs
reg sys_clk_p;
reg rst_n ;
wire sys_clk_n;
// Outputs
wire led;

// Instantiate the Unit Under Test (UUT)
led uut (
    .sys_clk_p(sys_clk_p),  
    .sys_clk_n(sys_clk_n),     
    .rst_n(rst_n),
    .led(led)
 );

initial 
begin
// Initialize Inputs
    sys_clk_p = 0;
    rst_n = 0;
// Wait for global reset to finish
	#1000;
    rst_n = 1; 
end
//Create clock
always #2.5 sys_clk_p = ~ sys_clk_p;  
assign  sys_clk_n = ~sys_clk_p ;

endmodule 

五、仿真

点击 Run Simulation 按钮,再选择 Run Behavioral Simulation。这里做一下行为级的仿真就可以了
在这里插入图片描述

六、生成bit文件

如果仿真结果无误,就可以生成比特流文件
在这里插入图片描述

七、ILA(逻辑分析仪)在线调试

ILA:用于在线观察内部信号的变化

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
本书是使用Zynq MPSoC开发人员的实用指南,同样也是希望熟悉器件及其相关设计方法的技术人员的有效参考。 Zynq MPSoC(多处理器片上系统)是Xilinx公司推出的第二代SoC系列产品,集成了复杂的处理系统,包括ARM Cortex-A53应用程序处理器和ARM Cortex-R5实时处理器,以及FPGA可编程逻辑。 来自苏格兰斯特拉斯克莱德大学(University of Strathclyde)的Louise Crockett团队基于这一平台的软件和硬件结构,撰写了Exploring Zynq MPSoC: With PYNQ and Machine Learning Applications,综合且全面地介绍了软件堆栈、多处理器处理系统以及可编程硬件阵列等问题。 程序员可以学会如何使用简单的软件界面和框架来快速实现他们的机器学习算法,系统设计师可以利用它来获取系统的最高性能。 内容导读 器件的架构 与Zynq7000相比,Zynq MPSoC 进一步整合了处理器系统中可选择的处理器数量和性能,最多可配备四个ARM Cortex-A53处理器内核和两个ARM Cortex-R5实时处理器内核。此外,该架构进一步拓展了可编程逻辑门阵列中的DSP切片和分布式存储器的规模。在开发当今新兴的AI应用程序时,全新的MPSoC架构将实现繁琐的算术计算和数据移动的过程变得十分轻松有趣。 设计工具和方法 SoC系统将包括硬件设计和软件设计两个方面。硬件设计会映射到SoC设备上的FPGA逻辑资源,而软件则运行在一个或多个系统内部署的处理器上。在此设计流程中,硬件和软件开发可以在很大程度上独立进行,然后整合。工程师使用他们选择的工具生成硬件系统的元素,并使用Xilinx Vivado开发环境实现系统集成和实现目标设备。软件开发人员可以使用Xilinx软件开发工具包(SDK)进行开发。这是传统的软硬件协同设计方法。 Xilinx的SDx开发环境则是一种更高级的开发方式。在Xilinx SDx工具中可以完全使用软件代码对整个系统进行描述,然后对各种计算进行资源分配(在用户指导下)。这使得面向软件的软硬件协同设计已经发生了相当大的转变。本书的第4章中更详细地讨论了关于SDx设计方法。 更先进的应用实现 本书还讨论了Zynq上许多应用程序的实现,包括FINN-R开源框架的有效性神经网络的实现、基于Python的Zynq设备框架和机器学习应用程序。我们可以预见到一些基于Zynq的更为优秀的产品,包括高级驾驶员辅助系统(ADAS),计算机视觉,“大数据”分析等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值