本原创文章由深圳市小眼睛科技有限公司创作,版权归本公司所有,如需转载,需授权并注明出处(www.meyesemi.com)
在FPGA技术于5G、AI及低空经济等新兴领域持续"破圈"、国产替代加速的宏大背景下,小眼睛科技联合紫光同创及电子发烧友共同发起了"拥抱开源------一起来做FPGA开发板"的项目。历时半年,集结了100多位来自各行各业的工程师智慧,我们成功打造了这款凝聚集体心血的紫光HiYou开源开发板(OPHW-25H)。
这款基于国产紫光同创Logos-2系列芯片的开发板,不仅是千元内入门级产品中唯一配备PCIe接口的轻量级利器,更实现了从硬件设计到底层代码的全方位开源,旨在为广大开发者提供一个高性价比、高扩展性的国产FPGA学习与验证平台,共同点燃技术创新的火花。

(详情见技术论坛:https://www.szlogicmatrix.com/)
****1.****实验简介
实验目的:
通过按键控制4个LED灯按顺序依次点亮和熄灭。OPHW-25开发板有4个用户LED灯(LED0~3),FPGA输出高电平时对应的LED灯亮灯(详情请查看"OPHW-25开发板硬件使用手册")。控制4个LED灯按顺序依次点亮和熄灭。
实验环境:
Window11
PDS2022.2
硬件环境:
OPHW-25开发板
****2.****实验原理
通常的时,分,秒的计时进位大家应该不陌生;
1小时=60分钟=3600秒,当时针转动1小时,秒针跳动3600次;

在数字电路中的时钟信号也是有固定的节奏的,这种节奏的开始到结束的时间,我们通常称之为周期(T)。

在数字系统中通常关注到时钟的频率,那频率与周期的关系如下:

OPHW-25板卡上单端时钟有一个50MHz和一个27MHz的晶振提供时钟给到OPHW-25;实验分析:
控制LED亮灭需要控制IO输出的高低电平即可(低电平点亮,高电平熄灭),原理图如下:

控制LED依次0 .5s亮,0.5s灭,需要控制IO依次输出0 .5s高电平,0.5s低电平周期变化。如下图波形:

若使用50MHz外部输入时钟,时钟周期为20ns(在verilog设计中的计数器的计时原理基本上是一致的,确认输入时钟周期和目标计时时间后可得到计数器的计数值到达多少后可得到计时宽度);

IO输出状态只有两种:1或0;我们可以使用一个计数器,计数满25000000个时钟周期时变化不同LED点亮。
****3.****实验源码设计
****3.1.****文件头设计
在module之前添加文件头,文件头中包含信息有:公司,作者,时间,设计名,工程名,模块名,目标器件,EDA工具(版本),模块描述,版本描述(修改描述)等信息;以及仿真时间单位定义;

`timescale1ns/1ps表示仿真精度是1ns,显示精度是1ps;
`defineUD#1定义UD表示#1;#1仅仿真有效,表示延时一个仿真精度,结合上一条语句表示延时1ns;
3.2.设计module

此段代码是标准的module创建的模型,module创建时需要确认输入输出信号并定义好位宽,之后在对module进行具体的逻辑设计;管脚与管脚之间用","隔开,最后一个管脚不用间隔符号;
创建module时需要定义输入输出信号;本实验输入时钟和复位即可,输出是控制LED的亮灭,OPHW-25板卡上共有4个LED,故而输出4bit位宽的信号;
单个状态计数25_000_000,即24_999_999=25'b1_0111_1101_0111_1000_0011_1111;所以计数器的位宽为25位即可;
当计数器计数到25'd24_999_999时,计数过程包含了从0~26'd2499_9999的时钟周期,故而总时长时25'd25_000_000×Tclk;硬件输入时钟为50MHz,所以此计数器的计数周期是0 .5s;
在指定的时间刻度上对LED 的状态进行变更,以达到控制LED 依次亮灭的目的; led_light_cnt的计时周期为0 .5s,故在led_light_cnt上取一个点来变更LED的显示状态即可完成每隔0.5s让LED显示发生变化;由于LED亮和灭只有两个状态,在赋值处理上将寄存器进行移位操作;

3.3.完整的Module


****3.4.****硬件管脚分配
OPHW-25的LED和CLK与FPGA的IO连接部分的原理图如下,详情可查看硬件使用手册或原理图:


复位设计是低电平有效,OPHW-25开发板提供了4个用户按键,按键低电平有效,但按键按下时,IO上的输入电压为低;当没有按下按键时,IO上的输入电压为高电平;选择任一个用户按键作为复位输入即可。
****4.****实验现象
4颗LED灯按照设定的顺序和时间依次点亮和熄灭。