ZYNQ——PL端流水灯的实现

这篇具有很好参考价值的文章主要介绍了ZYNQ——PL端流水灯的实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一、介绍

本文介绍的是在ZYNQ 7020黑金开发板上实现PL端流水灯的例子,开发板上PL端的LED灯总共有4个,在原理图中找到 PL LED 如下图所示,通过看图可知,给 LED 置低电平时灯才亮。
ZYNQ——PL端流水灯的实现
这里预想的实验结果是:在1秒钟内,4个LED各亮0.25秒,看起来就像流水灯一样。
LED:4个,赋值为0时即点亮。
时钟:50MHz。
复位:低电平有效,按键设为开发板上的 PL KEY1。
计数:电平每变化一次就加1,加到49999999后重新置为0。


二、代码编写

工程的创建这里不再过多介绍,之前的文章已经介绍过了。
下面的代码就是在计数到0,0.25,0.5,0.75秒这些时刻时,点亮对应的1个LED灯。

`timescale 1ns / 1ps

module led(
    input sys_clk,
    input rst_n,
    output reg[3:0] led
    );
    
reg[31:0] timer_counter;

always@(posedge sys_clk or negedge rst_n)
begin
    if(!rst_n)
    begin
        led <= 4'b1111;  //置0时灯才亮
        timer_counter <= 32'd0;
    end
    else if(timer_counter == 32'd0)
    begin
        led <= 4'b1110;
        timer_counter <= timer_counter +32'd1;
    end
    else if(timer_counter == 32'd12_500_000)
    begin
        led <= 4'b1101;
        timer_counter <= timer_counter +32'd1;
    end
    else if(timer_counter == 32'd25_000_000)
    begin
        led <= 4'b1011;
        timer_counter <= timer_counter +32'd1;
    end
    else if(timer_counter == 32'd37_500_000)
    begin
        led <= 4'b0111;
        timer_counter <= timer_counter +32'd1;
    end
    else if(timer_counter == 32'd49_999_999)
    begin
        timer_counter <= 32'd0;
    end
    else
    begin
        led <= led;
        timer_counter <= timer_counter +32'd1;
    end
end
endmodule

下面代码实现的功能与上面代码一致,其中引入了case语句。

`timescale 1ns / 1ps

module led(
    input sys_clk,
    input rst_n,
    output reg[3:0] led
    );
    
reg[31:0] timer_counter;

always@(posedge sys_clk or negedge rst_n)
begin
    if(!rst_n)
    begin
        led <= 4'b1111;
        timer_counter <= 32'd0;
    end
    else if(timer_counter == 32'd49_999_999)
//  else if(timer_counter == 32'd19)  //用于测试
        begin
            timer_counter <= 32'd0;
        end
    else
    begin
        case(timer_counter)
            32'd0          : led <= 4'b1110;
            32'd12_500_000 : led <= 4'b1101;
            32'd25_000_000 : led <= 4'b1011;
            32'd37_500_000 : led <= 4'b0111;
//            32'd0  : led <= 4'b1110;  //用于测试
//            32'd5  : led <= 4'b1101;
//            32'd10 : led <= 4'b1011;
//            32'd15 : led <= 4'b0111;
        endcase
        timer_counter <= timer_counter + 32'd1;
    end
end
endmodule

代码编写完成后系统会自动保存,注意看右侧边栏处是绿色还是红色,是绿色就说明代码没有错误,把鼠标放在绿色框上面就会显示下面的信息。
ZYNQ——PL端流水灯的实现
如果是红色就说明代码中有错误,代码出错的地方也会有红色的波浪线,如下图所示。
ZYNQ——PL端流水灯的实现
顺便提一下,这个Vivado默认的代码字体太小了,在菜单栏点击Tools——>Settings打开设置窗口,找到Text Editor——>Fonts and Colors,在右侧就可以设置代码的字体大小了。
ZYNQ——PL端流水灯的实现


三、引脚分配

在左侧 RTL ANALYSIS 下点击 Open Elaborated Design 查看原理图,如下图所示。
ZYNQ——PL端流水灯的实现
如果在底部没有 I/O Ports 可以点击顶部菜单栏 Window 下的 I/O Ports 选项调出。
ZYNQ——PL端流水灯的实现
然后就要参考原理图给这些端口分配引脚。
复位是低电平有效的,将其和开发板上PL的一个按键进行绑定,如下图所示,选择开发板上的第四个实体键 PL KEY1(前三个分别是复位和两个PS端的按键),对应的原理图引脚是KEY1。
ZYNQ——PL端流水灯的实现
开发板上的PL端实体按键如下图所示。
ZYNQ——PL端流水灯的实现
四个 LED 和按键 KEY1 对应的引脚如下图所示。
ZYNQ——PL端流水灯的实现
时钟选择的是 50MHz,在原理图中找到相应的名称,如下图。
ZYNQ——PL端流水灯的实现
然后找到该名称对应的引脚是U18,如下图所示。
ZYNQ——PL端流水灯的实现
其中顶部的VCC3V3代表3.3V,因此将其VCC设置为LVCMOS33*,如下图所示就分配完成了。
ZYNQ——PL端流水灯的实现
命名并保存该文件,该文件是后缀为xdc的约束文件,打开后如下图所示。
ZYNQ——PL端流水灯的实现
后续也可以通过编辑该文件实现引脚的分配或者修改。
接下来运行综合,完成后打开约束向导面板,设置系统时钟为50MHz。
ZYNQ——PL端流水灯的实现
这时候约束文件中也会多一行代码,如下图所示。
ZYNQ——PL端流水灯的实现


四、仿真分析

在下载比特流文件到开发板之前,之所以先在Vivado软件中仿真,是因为生成比特流的过程太慢了,如果你每改动一次就在板子上验证一下实在是太费时间了,所以提前在仿真中调试好代码,有把握后到开发板上验证即可。
上面提供的代码中,用于测试的代码可以将计数量缩小,这样在仿真中就可以缩短仿真时间,这对整体的功能实现没有任何影响,不过要在生成比特流文件时记得将代码改过来。
在 Simulation Settings下可以设置仿真的运行时长,这里根据需要设置。
ZYNQ——PL端流水灯的实现
新建一个用于仿真的源文件,如下图。
ZYNQ——PL端流水灯的实现
完成后在文件中写入下面的仿真测试代码。

`timescale 1ns / 1ps

module sim_led();
reg sys_clk; 
reg rst_n;
wire [3:0] led;

initial 
begin 
sys_clk = 1; 
rst_n = 0 ; 
#100;  //延迟100ns
rst_n = 1; 
end 

//Create clock 
always #10 sys_clk = ~ sys_clk; //时钟频率为50MHZ,周期为20ns,因此每延迟10ns,时钟翻转一次

// Instantiate the Unit Under Test (UUT) 例化待测设计
led  uut_led(
	.sys_clk (sys_clk),
	.rst_n (rst_n),
	.led (led)
	);
	
endmodule

先用Vivado自带的仿真工具进行简单的行为仿真,得到的结果如下图所示。仿真这部分的操作如果不太熟悉可以参考文章:Vivado中Simulator仿真软件的使用。
ZYNQ——PL端流水灯的实现
通过上述仿真,其结果与代码中预设的一致,那下面就可以到开发板上验证了。如果仿真结果与自己的预想不一致,就要修改代码,重新仿真,直到结果与自己的预期相符,然后再到开发板上验证。


五、添加 ILA IP

ILA(Integrated Logic Analyzer),即集成逻辑分析仪,这里添加两个探针,分别设置为4位和32位,对应代码中的 led 和 timer_counter。这一部分的详细介绍可以参考文章:使用Vivado软件进行硬件调试。
ZYNQ——PL端流水灯的实现
生成后打开ila_0文件,复制84-90行的内容,注意有多个探针时的位数设置,在代码中不要搞错。
ZYNQ——PL端流水灯的实现
在led.v文件的endmodule前添加下面的代码。
ZYNQ——PL端流水灯的实现
ILA 就添加完成了。


六、板上验证

接下来点击生成比特流(Generate Bitstream),这个时间会比较长,完成后弹出下面对话框,选择Open Hardware Manager。
ZYNQ——PL端流水灯的实现
连接好开发板的JTAG接口,给开发板上电,然后下载比特流文件到开发板。
ZYNQ——PL端流水灯的实现
添加ILA后Debug probes file这里也会有文件。
ZYNQ——PL端流水灯的实现
下载进度条满了之后就说明下载成功了,PL端流水灯的演示如下动图所示。
ZYNQ——PL端流水灯的实现
使用集成逻辑分析仪查看,给其设置一个触发值25000000,可以看到,从25000001开始,LED的值发生了变化,如下图所示。
ZYNQ——PL端流水灯的实现
当然,在12500000和37500000处,LED的值也会发生变化。通过仿真、开发板上LED的动图以及ILA分析,其结果是按照代码中设置的那样输出的。


以上就是 ZYNQ——PL端流水灯的实现的全部内容了!
参考资料:
ZYNQ 开发平台 FPGA 教程 AX7020文章来源地址https://www.toymoban.com/news/detail-493843.html

到了这里,关于ZYNQ——PL端流水灯的实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 51单片机实现流水灯

    我们之前说过可以控制管脚口电平来控制LED的亮灭,低电平灯亮,高电平灯灭,具体可以看我之前的博客。 P20~P27可以用八位二进制数来表示每一位的电平,第八位是P20,第一位是P27,那么11111110就代表P20亮,其他灭,11101111就代表P24亮,其他灭。流水灯的代码就可以写成这样

    2024年02月11日
    浏览(36)
  • 基于stm32的流水灯实现

    主控芯片:  正点原子STM32F103ZET6精英开发板 oled:中景园七针脚0.96寸oled 代码编程软件: keil5 代码下载地址: stm32流水灯项目 希望大家仔细看一看是否符合自己的需求,实际上本文中写到的很多东西已经能为课设所用,理清逻辑后自己编程也很方便的,但如果想直接copy我的项目

    2024年02月07日
    浏览(27)
  • FPGA学习——verilog实现流水灯

    学习芯片: EP4CE6F17C8 verilog代码如下: 配置引脚,查看芯片的指导书: 烧录运行结果如下: 如图我们可以看见开发板上四个led灯同时被电亮。 代码如下: 配置引脚,查看clock和key的引脚: 运行结果如下图: 此时可以看见四个led灯同时闪烁。 流水灯代码实现: 实验效果图如

    2024年02月16日
    浏览(40)
  • 利用STM32实现流水灯程序

    keil MDK安装与新建工程 在KEIL MDK官网中下载KEIL MDK ARM,下载链接如下:MDK-ARM Version 5.38a Evaluation Software Request (keil.com),在填写信息后进行安装和下载。 安装后进行以下操作: 右键keil5图标,点击“以管理员身份运行” 进入之后, 点击“ file ”里边的选项“ License Management ”

    2024年02月06日
    浏览(31)
  • ARM入门(实现LED流水灯)超简单

            实现效果将LDE2到LED5依次点亮再依次熄灭。点亮LED灯就像我们接触编程语言的第一天输出一个\\\"hello world\\\"一样,这是一个最基础的入门操作。这里我们以点亮LED2的过程进行详细讲解,因其他LED灯的点亮过程都是一样的,所以就不做一一介绍了。 1、首先第一步我们需

    2023年04月10日
    浏览(33)
  • 基于Nios-II实现流水灯

    1、新建Quartus项目,选择使用的芯片 这里我选择的芯片类型为EP4CE115F29C7,你也可以根据自己需要,选择其他芯片。 注意,部分芯片(例如MAX10-02SCM)经过笔者测试,似乎使用不了Nios-II,因为会提示无法使用mif文件。 2、Qsys设计 2.1 进入Tools - Platform Designer 进入后,首先点击

    2023年04月11日
    浏览(23)
  • FPGA学习分享--01 led流水灯的实现

    需求 : 博宸电子的ZYNQ7020DEV开发板 Vivado 2018.3 一定的verilog语言基础 博主目前学习的是 博宸电子的ZYNQ7020DEV开发板 ,下面是关于本次分享led流水灯的原理图 图1 涉及本次led流水灯的电路 首先,从图1来看,每个led端口都和一个阻值为4.7k的电阻和一个发光二极管相连,并且发光

    2024年02月04日
    浏览(26)
  • 51单片机流水灯三种实现方法

    流水灯可以用三种方法实现 一.通过移位函数  _crol_()  和  _cror_() 二.位移实现流水灯 三.数组流水灯实现 首先说一下流水灯的原理 让0从左往右位移或者从右往左位移 从而实现流水灯依次点亮 电路图如下,使用软件是project 使用左移函数代码如下  ///运行结果是LED灯从上到

    2023年04月09日
    浏览(41)
  • FPGA 学习笔记:Verilog 实现LED流水灯控制

    在初步了解 Xilinx Vivado 的使用后,开启了FPGA Hello World 程序:LED 流水灯控制 在嵌入式MCU中,流水灯需要延时来实现,FPGA的延时,使用外部晶振来实现 实现 3个 LED 流水灯控制,也就是循环依次点亮, LED 低电平亮, 高电平灭,FPGA 有一个40MHz的外部晶振,作为系统时钟输入开

    2023年04月08日
    浏览(30)
  • 设计分享|74LS138译码器实现流水灯

    具体实现功能: 74LS138译码器实现流水灯的控制。 设计介绍 51单片机简介 51单片是一种低功耗、高性能CMOS-8位微控制器,具有8K可编程Flash存储器,使得其为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。 51系列单片机具有以下标准功能: 8k字节Flash,512字节RAM,

    2024年02月06日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包