实验一:永远的流水灯
扫描频率配置为100Hz,即是说扫描周期为10ms.这里需要注意的是扫描周期的概念。流水灯嘛,顾名思义,扫描周期指的是流水灯扫一轮所需要的时间。听到说周期,就应该想到在建模的时候需要写计数器模块,这个计数器模块应该是神一般的独立存在,独立运行。每隔10ms复位一次,复位后又重新开始计数。
实验二:闪耀灯和流水灯
闪耀灯涉及到闪耀频率,流水灯涉及到扫描频率的概率。这里先区分一下闪耀频率和扫描频率的概念。闪耀频率对应闪耀周期,闪耀周期是针对于单个LED灯而言的,即是指LED灯亮的时间加上熄灭的时间总和称为一个闪耀周期。
关于写计数器模块,对于时间较长的周期,可以采用分级的方式来写,例如:100ms的时间,前一级我们可以先写一个1ms的计数模块,当这一级的计数器计满1ms的时候,可以把这一刻当做后一级100ms计数器的一个条件语句,触发下一级的计数。
在流水灯模块,最后采用位拼接运算来控制rLED_Out各个位的电平,达到控制LED灯的目的。其中语句:
rLED_Out <= {rLED_Out[1:0],1’b0};//注意这里面的没一个量都要限定位宽
每次执行此条语句,相当于把最低位赋值0,把rLED_Out[1:0]赋值给rLED_Out[2:1],即原来的第0位放在现在的第一位,原来的第1位放在现在的第2位,这相当于把数据进行了左移操作。
总结:
对比一下实验一与实验二的流水灯建模思路:
实验一把每一颗LED灯当做一个功能模块进行单独建模,通过一个总的计数器计数,把计数器计数的范围值当做控制LED灯亮与灭的条件控制语句。
实验一建模框图
实验二把流水灯当做一整个模块,在定义output时定义[2:0]LED_Out;即有多少颗LED灯,就定义多少个位,通过写出状态移位控制程序来控制LED灯的亮与灭,达到流水灯的效果。
实验二建模框图