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