FPGA零基础学习之Vivado-LED流水灯实验

作者:李西锐 校对:陆辉,来源: FPGA技术江湖微信公众号

流水灯是大多数学习者接触到的第一个实验,也是非常经典的一个实验,在此,我们一起学习一下流水灯。

LED,又名发光二极管。LED灯工作电流很小(有的仅零点几毫安即可发光),抗冲击和抗震性能好,可靠性高,寿命长。由于这些优点,LED灯被广泛用在仪器仪表中作指示灯、液晶屏背光源等诸多领域。

发光二极管与普通二极管一样具有单向导电性。给它加上阳极正向电压后,通过5mA左右的电流就可以使二极管发光。通过二极管的电流越大,发出的光亮度越强。不过我们一般将电流限定在3~20mA之间,否则电流过大就会烧坏二极管。

在我们的开发板上有四个LED,设计逻辑为:FPGA 输出高电平时,LED 点亮;FPGA 输出低电平时,LED 熄灭。


本次设计框架如上图。

管脚说明:

设计代码如下:


parameter 可以定义一个参数(默认是32 位)。在写代码时,对于某些数字,设计者经常利用定义参数的方式进行编写,方便修改,也方便阅读。

其中计数器,需要计数到1s所需的次数,时间到了之后,LED灯切换点亮。按照此规则,实现LED的循环点亮。

在verilog 中,“{}”( 大括号)的第一个特殊作用为位拼接。{a,b}相当于将a 和b 拼接为一个整体,并且是高位为a,低位为b。当led 输出为4’b0001 时,第一个led 点亮;经过1 秒钟,输出4’b0010 时,第二个led 点亮;经过1 秒钟,输出4’b0100 时,第三个led 点亮;经过1 秒钟,输出4’b1000 时,第四个led 点亮;经过1 秒钟,输出4’b0001 时,第一个led 点亮······按照上述的过程周而复始,就形成了流水灯。

不难发现,led 的输出,一直为3 个0,1 个1。并且1 的位置每1 秒钟移动一次,从头到尾,然后又到头。这种现象可以利用移位的思想进行实现。即:led[3]<=led[2]; led[2]<=led[1];led[1]<=led[0]; led[0]<=led[3];如果将被赋值的组成一个整体,那就是led,赋值的组成一个整体就是{led[2:0], led[3]}。

仿真代码:


$stop 是一个系统任务,功能为将仿真工具的仿真停止。运行分析综合后,打开RTL 仿真。

点击Run Simulation,打开仿真器。可以看到如图所示波形。

由于我们设计的流水灯是每1 秒钟流动一个,在上述的仿真中,led 数值是不会变化的。如果仿真几秒钟的话,仿真的时间会比较长。在此不建议仿真几秒钟的时长,有可能会导致电脑卡住。

仿真时,可以将t 的值,改成一个较小值。例如:10。然后在此编译仿真。改的时候我们可以在仿真文件中加入一句话:

修改后我们重新运行仿真工具,可以看到如图所示波形:

这样我们可以清楚的看到输出变化的过程。另外,我们这样做还有一个省事的地方,就是我们下板不需要再修改t的参数。

接下来我们分配引脚,生成下板文件。

分配好之后,点击Generate Bitstream。

生成完成之后,点击open Hardware Manager。下板即可。

最新文章

最新文章