基于Verilog实现电器定时开关控制
4.1按键扫描及键值读取
CPLD检测到kb下降沿时,表示有键按下时,为防止按键抖动,延时一段时间再检测,若确有键按下,CPLD采用低电平逐行扫描,待找到按键时,根据扫捕得到的数值,确定按键值。对于无效按键,设按键值为"15"。输入信号kb的下降沿触发对键值的读取,可保证对于每一次按键,仅作一次处理。主要程序如下:
4.2功能键的判断
程序初始化时为设定时间、开启电器编号、电器开启时间、电器关闭时间4个功能键设置对应按键值。定义功能标志寄存器fun,并使用格雷码标志各个功能,相邻两个功能的编码仅有一位不同,可避免状态跳变,比目前常用的独热码节省CPLD逻辑单元。由于本设计中寄存器fun只有5个状态,选用3位格雷码,并对编码方式进行改进。根据上一步得到的按键值判断具体要实现哪个功能,并依此设置fun的值,如下所示:
先根据键值判断是哪一个数字键,再根据功能标志寄存器fun判断进行哪项设置。若正在进行的是时间设置,则将时间寄存器左移4位,将数字值存入低位;若为设定需要开启电器的编号状态,则电器编号数组num对应位置"1",并通过电阻使相应发光二极管点亮,否则为"0";若为设定电器开启时间状态,相应电器的开启时间寄存器timeon左移4位,将数字值存入低位;若为设定电器关闭时间状态,相应电器的关闭时间寄存器timeoff左移4位,将数字值存人低位。若为无效按键,则不进行任何操作。
4.4数字钟的工作
本系统设计作为数字钟和定时器,对计时准确性要求较高.由有源晶体振荡器提供系统时钟,可保证其稳定度。在顶层模块中对系统时钟分频,得到1 Hz时钟,作为数字钟部分行波时钟。这样减少了片内各触发器之间的时钟偏移,事实证明,对设计时序无不良影响。 先将没定的时间送人小时、分钟对应的寄存器hour和min,为了显示和用户操作方便,用6位二进制寄存器,以8421BCD码表示时间。如果秒为8'h59则秒寄存器sec清零,分钟值加1,若秒值末位为"9",则秒值末位清零,秒值十位加1。
4.5判断电器的开启和关闭
若当前时间与某个已定时的电器的开启时间相同,则开启寄存器数组on对应位输出高电平,开启对应电器;若与某个已定时的电器的关闭时间相同,则开启寄存器数组on对应位输出低电平,关闭对应电器。
评论