一、 实验目的
实现对多LED灯的控制;
二、 实验要求
控制8个LED以1s的周期闪烁(0.5s亮,0.5s灭)
三、实验原理
通常的时,分,秒的计时进位大家应该不陌生;
1小时=60分钟=3600秒,当时针转动1小时,秒针跳动3600次;
那在数字电路中的时钟信号也是有固定的节奏的,这种节奏的开始到结束的时间,我们通常称之为周期(T)。
在数字系统中通常关注到时钟的频率,那频率与周期的关系如下:
MES2KG板卡上有一个40MHz的晶振提供时钟给到PGC2KG;
实验分析 :
控制LED亮灭需要控制IO输出的高低电平即可(高电平点亮,低电平熄灭),原理图如下:
控制LED周期性的维持0.5s亮,0.5s灭,需要控制IO输出0.5s高电平,0.5s低电平周期变化,如下图波形:
外部输入时钟为40MHz时钟周期为25ns(在verilog设计中的计数器的计时原理基本上是一致的,确认输入时钟周期,目标计时时间后可得到计数器的计数值到达多少后可得到计时宽度);
0.5s = 20000000*25ns = 20000000 × ;
IO输出状态只有两种:1或0;我们可以使用一个计数器,计数满20000000个时钟周期时将IO状态进行翻转,即可完成每0.5S输出状态跳转,即LED灯会以0.5S的间隔亮灭变化;
四、实验源码设计(完整源码查看demo源文件)
a. 文件头设计
在module之前添加文件头,文件头中包含信息有:公司,作者,时间,设计名,工程名,模块名,目标器件,EDA工具(版本),模块描述,版本描述(修改描述)等信息;以及仿真时间单位定义;
timescale 1ns / 1ps 表示仿真精度是 1ns,显示精度是 1ps;
define UD #1 定义 UD 表示#1;#1 仅仿真有效,表示延时一个仿真精度,结合上一条语句表示延时 1ns;
b. 设计 module
- 创建 module,确定输入输出信号
此段代码是标准的 module 创建的模型,module 创建时需要确认输入输出信号并定义好位宽,之后在对 module 进行具体的逻辑设计;管脚与管脚之间间隔用“,”,最后一个管脚不用间隔符号;
创建 module 时需要定义输入输出信号;本实验输入时钟和复位即可,输出是控制 LED 的亮灭,MES2KG 板卡上共有 8 个 LED,故而输出 8bit 位宽的信号;
单个状态计数 20000000, 1 个亮灭周期的计数即为 40000000 = 26’ h2625A00;所以计数器的位宽为 26 位即可,此处请结合数字电路中的同步计数器的工作原理分析;
当计数器计数到 26’d19999999 时,计数周期包含了从 0~26’d19999999的时钟周期,故而总时长时 26‘d20000000 ×