基于ZYNQ ECO开发板的跑马灯实验
基于ZYNQ ECO开发板的跑马灯实验
1.理论学习
如果大家之前玩过单片机肯定知道,跑马灯实验绝对是一个经典的例程,其效果是让排成一排的led灯依次闪亮,像“流水”一样循环不止,
看上去很舒服,其原理就是依次控制每个连接到led灯的I/O电平的高低,我们本次的实验是让led灯依次闪亮的间隔为1s,也就是让led灯
每次只亮一个,每次亮的时间为1s ,本文档我们还会涉及到让led灯依次闪亮的新语法。
2.实战演练
2.1 实验目标
依次点亮板载的4个LED灯,实现跑马灯的效果,两灯之间点亮间隔为1s,LED灯一次点亮持续时间1s。
2.2 程序设计
2.2.1模块框图
我们给模块取名为water_led,因为我们要让led灯亮的时间为1s,肯定少不了计数器,既然用到计数器,那时钟和复位信号也是必须有的,
所以输入为时钟和复位信号。我们只需要控制led灯亮的时间和哪一个led灯亮,流水的过程会无限循环下去,所以不需要额外的其他输入
信号,而输出为4bit的led_out,用于控制板子上的4个小灯,使它们依次闪亮产生流水的效果。
设计框图如下图所示
端口列表与功能总结如表格
led跑马灯状态图
2.2.2实现步骤
2.2.2.1Vivado使用
创建项目以及芯片选型:
添加源文件 :
代码如下:
[rihide]
`timescale 1ns / 1ps
module water_led(
input clk, //系统时钟50MHz
input rst_n, //全局复位
output [3:0] led //输出控制led灯
);
parameter clk_1s=32'd50_000_000;
reg [31:0] cnt;
//------1s计时模块------
always@(posedge clk)
if(!rst_n)
cnt<=0;
else if(cnt==clk_1s-1)
cnt<=0;
else
cnt<=cnt+1;
//------跑马灯实现模块------
reg[3:0]led_out;
always@(posedge clk)
if(!rst_n)
led_out<=4'b0001;
else if(cnt==clk_1s-1)
led_out<={led_out[2:0],led_out[3]} ;
else
led_out<=led_out;
assign led=led_out;
endmodule
[/rihide]
可将此代码复制粘贴过去保存文档后,按下面步骤操作进行综合,并进行管脚约束
在上面的操作完成后,需等待综合完成,综合完成后会出现下图弹窗:
管脚约束:
[rihide]上板验证之前先要进行管脚约束。工程中各输入输出信号与开发板管脚对应关系如表格所示。 进行管脚分配:
每个端口的电压都要选择为LVCMOS33
[/rihide]
选择好之后按CTR+S键进行保存,保存时会出现弹窗让你命名,可按照喜好命名,但不能用中文命名,完成后继续按照下图进行操作
此时出现的弹窗全部点击ok就行,然后进行等待比特流完成,之后将进行硬件连接
上板验证:如烧录后led灯进行流水效果则证明实验成功
此时你将看到视频中的流水效果:
3.总结
本章通过一个最经典的跑马灯例子重点引入了位拼接这个新语法,位拼接操作符是很常用的运算符,在串并转换、
移位寄存器的设计中都很常用,希望大家一定掌握它的用法。
3.1 重点掌握
1.{}(实现拼接功能的位拼接运算符)
3.2 知识点总结
1.能够熟练根据时钟计算出任意精确计时所需要计数的个数;
2.掌握位拼接运算符的使用。
4.拓展训练
1、本次思考给大家布置一个学习的任务,自行查阅相关资料,用左移(<<)的方法实现同样的功能,
并与使用位拼接操作符进行的移位方式进行对比,总结各自的特点与优点。
2、本例我们实现的是向左流水效果,我们尝试将其改为双向往复循环移动,并上板验证。