ZYNQ——PL端流水灯的实现

news2024/11/16 19:25:50

文章目录

  • 一、介绍
  • 二、代码编写
  • 三、引脚分配
  • 四、仿真分析
  • 五、添加 ILA IP
  • 六、板上验证


一、介绍

本文介绍的是在ZYNQ 7020黑金开发板上实现PL端流水灯的例子,开发板上PL端的LED灯总共有4个,在原理图中找到 PL LED 如下图所示,通过看图可知,给 LED 置低电平时灯才亮。
在这里插入图片描述
这里预想的实验结果是:在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

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


三、引脚分配

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


四、仿真分析

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

`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仿真软件的使用。
在这里插入图片描述
通过上述仿真,其结果与代码中预设的一致,那下面就可以到开发板上验证了。如果仿真结果与自己的预想不一致,就要修改代码,重新仿真,直到结果与自己的预期相符,然后再到开发板上验证。


五、添加 ILA IP

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


六、板上验证

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


以上就是 ZYNQ——PL端流水灯的实现的全部内容了!
参考资料:
ZYNQ 开发平台 FPGA 教程 AX7020

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/656831.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MarkDown】CSDN Markdown之四象限图quadrantChart详解

四象限图 四象限图是一种将数据分为四个象限的可视化方法。它用于在二维网格上绘制数据点&#xff0c;其中一个变量表示x轴&#xff0c;另一个变量表示y轴。根据针对正在分析的数据集的一组标准&#xff0c;将图表分成四个相等的部分来确定四个象限。经常使用四象限图来识别数…

父亲节|祝天下所有父亲节日快乐,长寿安康!

父亲节&#xff0c;是一个感谢父亲的节日。普遍认为的日期是每年6月的第三个星期日&#xff0c;在这一天世界上有52个国家和地区在过父亲节。同时注重孝道也是我们中华民族的传统文化。 在这个感恩的节日里 把最真诚美好的祝福 送给天下所有的父亲们 祝福他们 节日快乐&…

OpenAI 大模型生态

目录标题 1. 语言类大模型2. 图像多模态大模型3. 语音识别模型4. 文本向量化模型5. 审查模型6. 编程大模型1. 语言类大模型 包括GPT-3、GPT-3.5、GPT-4系列模型。并且,OpenAl在训练GPT-3的同时,训练了参数不同、复杂度各不相同的A、B、C、D四项大模型(基座模型),用于不同场景…

mysql 集群 MGR

mysql安装&#xff08;3台服务&#xff09; 1下载 wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.11-linux-glibc2.12-x86_64.tar.gz 2解压mysql wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.11-linux-glibc2.12-x86_64.tar.gz tar -zxvf…

键盘按键事件 通过键盘上下左右按键移动界面上图标

#main.c文件 #include “keyevent.h” #include int main(int argc, char *argv[]) { QApplication a(argc, argv); KeyEvent w; w.show(); return a.exec();} #include “keyevent.h”//头文件 #ifndef KEYEVENT_H #define KEYEVENT_H #include #include #include cl…

Windows安装Make工具(make.exe和mingw)

1、make.exe 官网介绍&#xff1a;Make是一个工具&#xff0c;它控制从程序的源文件生成程序的可执行文件和其他非源文件。Make从一个名为Makefile的文件中获取如何构建程序的知识&#xff0c;该文件列出了每个非源文件以及如何从其他文件中计算它。当你编写一个程序时&#x…

[性能测试工具]——Loadrunner的使用及安装指南

目录 一、基本概念 1.1 什么是性能测试&#xff1f; 1.2 性能测试和功能测试的区别&#xff1f; 1.3 什么样的软件属于性能好&#xff0c;什么样的软件属于性能不好&#xff1f; 1.4 哪些因素会影响到软件性能&#xff1f; 二、为什么对软件进行性能测试&#xff1f; 三、性…

压测工具Jmeter学习

压测工具Jmeter Jmeter介绍 Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试&#xff0c;它最初被设计用于Web应用测试&#xff0c;但后来扩展到其他测试领域。 它可以用于测试静态和动态资源&#xff0c;例如静态文件、Java 小服务程序、CGI …

Django基础入门④:数据表显示和Django模板详讲

Django基础入门④&#xff1a;数据表显示和Django模板详讲 数据表显示字段显示表单显示分块内联显示列表显示搜索栏目创建筛选排序分页导入导出 Django模板什么是模板模板使用render方法详解 &#x1f3d8;️&#x1f3d8;️个人简介&#xff1a;以山河作礼。 &#x1f396;️&…

CVPR | 时尚领域视觉语言预训练模型Kaleido-BERT

来源&#xff1a;投稿 作者&#xff1a;小灰灰 编辑&#xff1a;学姐 这是一篇在时尚领域、往细粒度方向做视觉-语言预训练的工作。 论文标题&#xff1a;Kaleido-BERT: Vision-Language Pre-training on Fashion Domain 论文链接&#xff1a;https://arxiv.org/abs/2103.1611…

深度刨析指针Advanced 2

作者主页&#xff1a;paper jie的博客_CSDN博客-C语言,算法详解领域博主 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文录入于《系统解析C语言》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白…

使用omp并行技术加速最短路径算法-迪杰斯特拉(Dijkstra)算法(记录最短路径和距离)

原理&#xff1a; Dijkstra算法是解决**单源最短路径**问题的**贪心算法** 它先求出长度最短的一条路径&#xff0c;再参照该最短路径求出长度次短的一条路径 直到求出从源点到其他各个顶点的最短路径。 首先假定源点为u&#xff0c;顶点集合V被划分为两部分&#xff1a;集合…

stable-diffusion-webui的介绍与使用——Controlnet1.1

源码地址&#xff1a;https://github.com/lllyasviel/ControlNet | 最新版本 controlnet-v1.1 论文地址&#xff1a;2302.Adding Conditional Control to Text-to-Image Diffusion Models 扩展UI地址&#xff08;需先安装sd-webui&#xff09;&#xff1a;https://github.com/M…

基于对Element UI的表单验证

文章目录 &#x1f412;个人主页&#x1f3c5;JavaEE系列专栏&#x1f4d6;前言&#xff1a;&#x1fa80;从以下源码中介绍&#xff1a;&#x1f380;这里是官网源码 &#x1f412;个人主页 &#x1f3c5;JavaEE系列专栏 &#x1f4d6;前言&#xff1a; 本篇博客主要以介绍基…

杂记——FDA获批的AI超声产品

目前&#xff0c;人工智能算法在医学图像领域发展迅猛。相对于CT、MRI等&#xff0c;人工智能在超声图像处理领域仍处于起步阶段。近年来&#xff0c;多项研究利用深度学习、计算机视觉和图像处理等技术&#xff0c;对超声图像进行自动化分析、识别和量化&#xff0c;提供辅助医…

Golang的pprof性能分析

文章目录 一、pprof 概述二、服务开启pprof1、代码中引用pprof2、服务开启一个端口&#xff0c;用来监听pprof 三、使用pprof采集CPU耗时1、调用流程图2、查看火焰图 四、使用pprof分析内存泄漏问题查看当前程序的内存占用查看goroutine的运行时间 五、性能优化案例背景1、压测…

WIFI中的频段、信道、信道带宽

一、波长、波速与频率 波长波速/频率 “波速”由“介质”决定。 “频率”由“波源”决定。 “波长”由“介质”(波速V)、“波源”(频率f)共同决定。&#xff08;λV/f&#xff09; 波长&#xff08;wavelength&#xff09;&#xff1a; 指波在一个振动周期内传播的距离。也就…

【正点原子STM32连载】 第三十二章 光敏传感器实验 摘自【正点原子】STM32F103 战舰开发指南V1.2

1&#xff09;实验平台&#xff1a;正点原子stm32f103战舰开发板V4 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第三十…

【网络面试必问】浏览器如何委托协议栈完成消息的收发

接上一篇&#xff1a;【面试中的网络知识】DNS原理-如何实现域名和IP地址的查询转换  在前面的博客中&#xff0c;提到过无数次&#xff0c;浏览器作为应用程序&#xff0c;本身是不具备向网络中发送网络请求的能力&#xff0c;要委托操作系统的内核协议栈来完成。协议栈再调用…

新手学习Vmp之控制流程图生成

新手学习Vmp之控制流程图生成 控制流程图的生成对于反混淆分析来说是非常重要的一步&#xff0c;这里记录一下我研究的过程&#xff0c;以Vmp2为例子。 这里我的环境准备如下: Visual Studio IDA SDK Capstone Unicorn Graphviz IDA SDK插件环境&#xff0c;主要是有一些AP…