05、安路SparkRoad国产FPGA测评【学习篇】流水灯
[复制链接]
本帖最后由 1nnocent 于 2022-7-27 15:43 编辑
该例程实现流水灯效果,一共使用的16个LED,点亮顺序为从左到右一次点亮,然后从右到左依次点亮。
先看原理图,16个蓝色LED,低电平时点亮。
硬件原理很简单,代码也非常简单,今天可以轻松一点。
输入接口就一个24M时钟,输出接口为16个LED,对应的FPGA引脚分别为(最后一个对应T13,有万恶的分页符没截到图):
代码一开始定义了一个计数的上限CNT,一共计数12000000次,时间为0.5S,这个历程里有例化“rst_n”模块,但是并没有使用,次历程赋初值是通过initial来赋值,之前以为initial只能在testbench上使用。
历程比较复杂一点的就是流水灯的逻辑,其实也没啥,历程的逻辑就是跟句flag判断灯的状态,再进行移位。当LED【0】为0时,flag=0;LED{15}为0时,flag=1;当LED【0】为零时即1111 1111 1111 1110 进行移位将0到14位往前移动移位即1111 1111 1111 1101,下次时还是进行同样的操作,总体过程为:
1111 1111 1111 1110
1111 1111 1111 1101
1111 1111 1111 1011
1111 1111 1111 0111
1111 1111 1110 1111
1111 1111 1101 1111
1111 1111 1011 1111
1111 1111 0111 1111
1111 1110 1111 1111
1111 1101 1111 1111
1111 1011 1111 1111
1111 0111 1111 1111
1110 1111 1111 1111
1101 1111 1111 1111
1011 1111 1111 1111
0111 1111 1111 1111
当检测到LED【15】为0时,再进行移位拼接,具体代码实现:
1111 1111 1111 1110 flag=0
0111 1111 1111 1111 flag=1
always @(posedge clk_24m)
begin
if(led == 0)
led <= 16'hfffe;
else if(cnt_time == CNT - 1)
begin
if(!flag)
led <= {led[14:0],led[15]};
else
led <= {led[0],led[15:1]};
end
else
led <= led;
end
历程运行效果:
流水灯movie
|