eda技术及应用课程设计-基于vhdl数字时钟的设计与实现内容摘要:

下图为二十四进制计数器仿真时序图,端口名及功能同上。 下图为各计数模块组合后的仿真时序, LD 为置数控 制端口,当 LD=2 时给秒的十位置数,当 LD=3 时为分个位置数,如下图所示: 数据选择模块 数据选择模块采用计数器来选择要发送的数据 ,在此模块中工作时钟信号为CLK_NUM1,即经过 20200 分频后的时时钟信号。 因为要发送的数据有十位因此 CNT1 为十进制计数器 ,要显示每个字符需发送 4 个数据,所以将 CNT2 设计为四进制计数器。 其 VHDL 程序实现如下: 数据选择器 PROCESS(CLK_NUM1) BEGIN IF CLK_NUM139。 EVENT AND CLK_NUM1=39。 139。 THEN REQ1 信号由检测 BUSY 信号产生 IF REQ1=39。 139。 THEN 以 REQ1 为信号,当 REQ1 为 CNT2=CNT2+1。 高电平时 读取 数据 IF CNT1=1001 THEN CNT1=0000。 ELSE CNT1=CNT1+1。 当 DOUT=9 时清零,同时产生进位 当 LD=2 时,秒的十位以秒的计数 时钟开始计数 当 LD=3 时,分的 十 位以秒的计数时钟开始 计数 END IF。 CASE CNT1 IS WHEN 1000=CNT=DOUT1(3 DOWNTO 0)。 秒的个位 WHEN 0111=CNT=DOUT1(7 DOWNTO 4)。 秒的十位 WHEN 0110=CNT=1010。 显示∶ WHEN 0101=CNT=DOUT1(11 DOWNTO 8)。 分的个位 WHEN 0100=CNT=DOUT1(15 DOWNTO 12)。 分的十位 WHEN 0011=CNT=1010。 显示∶ WHEN 0010=CNT=DOUT1(19 DOWNTO 16)。 小时的个位 WHEN 0001=CNT=DOUT1(23 DOWNTO 20)。 小时的十位 WHEN 0000=CNT=1100。 显示 M WHEN 1001=CNT=1011。 显示 A/P WHEN OTHERS=NULL。 END CASE。 END IF。 END IF。 END PROCESS。 AM/PM 的切换 C5=39。 139。 WHEN DOUT31=0000 AND DOUT32=0000 ELSE 39。 039。 当小时两位为 00 时 PROCESS(C5) 产生一进位信号 C5 BEGIN IF C539。 EVENT AND C5=39。 139。 THEN 当 C5 上升沿到来时 OUTAMP 取反 OUTAMP=NOT OUTAMP。 END IF。 CASE OUTAMP IS WHEN ‘ 0’ =AMP=X50。 AM 译码 ,当 OUTAMP=0 时取 AM WHEN ‘ 1’ =AMP=X41。 PM 译码 ,当 OUTAMP=1 时取 PM WHEN OTHERS=NULL。 END CASE。 END IF。 END PROCESS。 数据选择 PROCESS(CNT1) BEGIN CASE CNT1 IS WHEN 0000=DATA1=XF9。 DATA2=X02。 DATA3=X02。 DATA1 为命令字 WHEN 0001=DATA1=XF9。 DATA2=X03。 DATA3=X02。 DATA2 为横坐标 WHEN 0010=DATA1=XF9。 DATA2=X05。 DATA3=X02。 DATA3 为纵坐标 WHEN 0011=DATA1=XF9。 DATA2=X06。 DATA3=X02。 WHEN 0100=DATA1=XF9。 DATA2=X07。 DATA3=X02。 WHEN 0101=DATA1=XF9。 DATA2=X08。 DATA3=X02。 WHEN 0110=DATA1=XF9。 DATA2=X09。 DATA3=X02。 WHEN 0111=DATA1=xF9。 DATA2=X0A。 DATA3=X02。 WHEN 1000=DATA1=XF9。 DATA2=X0B。 DATA3=X02。 WHEN 1001=DATA1=XF9。 DATA2=X0C。 DATA3=X02。 WHEN OTHERS=NULL。 END CASE。 END PROCESS。 显示驱动模块 驱动液晶显示器 能够 显示 动态 数据 ,需以快速扫描的方式去读取所需显示的数据。 在发送数据时,检测 BUSY 信号,当 BUSY 信号为低电平时,即液晶块空闲,可以发送数据;当 BUSY 信号为高电平时,即液晶块忙,应该停止发送数据。 当 BUSY 信号为低电平时, 同时产生一个信号 REQ1,在读取数据时以 REQ1 为信号,高电平读取数据。 如果没有检测到BUSY 信号,则不发送数据。 其 VHDL 程序实现如下: 送显示 模块 PROCESS(CLK_NUM1,BUSY) IS BEGIN IF RISING_EDGE(CLK_NUM1) THEN IF BUSY=39。 039。 THEN REQ1=39。 139。 检测 BUSY 信号,当 BUSY 信号 为低 CASE CNT2 IS 电平时发送数据,同时将 REQ1 置 1 WHEN 00=DOUT=DATA1。 DATA1 为显示 ASCII 码命令字 WHEN 01=DOUT=DATA2。 DATA2 为横坐标 WHEN 10=DOUT=DATA3。 DATA3 为纵坐标 WHEN 11=DOUT=DATA4。 DATA4 为显示字符的 ASCII 码 WHEN OTHERS=NULL。 END CASE。 ELSIF BUSY=39。 139。 THEN REQ1=39。 039。 当 BUSY 信号为高电平时, REQ1 清零 END IF。 不发送数据 END IF。 REQ=REQ1。 END PROCESS。 数据译码 部分 PROCESS(CNT) BEGIN CASE CNT IS WHEN 0000=DATA4=X30。 显示 0 WHEN 0001=DATA4=X31。 显示 1 WHEN 0010=DATA4=X32。 显示 2 WHEN 0011=DATA4=X33。 显示 3 WHEN 0100=DATA4=X34。 显示 4 WHEN 0101=DATA4=X35。 显示 5 WHEN 0110=DATA4=X36。 显示 6 WHEN 0111=DATA4=X37。 显示 7 WHEN 1000=DATA4=X38。 显示 8 WHEN 1001=DATA4=X39。 显示 9 WHEN 1010=DATA4=X3A。 显示 : WHEN 1011=DATA4=AMP。 显示 A、 P WHEN 1100=DATA4=X4D。 显示 M WHEN OTHERS=NULL。 END CASE。 END PROCESS。 仿真时序如下图: CLK 为时钟信号, BUSY 为液晶块响应信号, REQ 为发送数据信号,高电平发送数据。 DOUT为所发送的数据。 CO为进位信号, LD 为置数端 整点报时模块 当计数满一小时时报警一次,即检测分十位的进位信号,当 C4=1 时开始报警,并报警一分钟。 其 VHDL 程序实现如下 : 整点报时 PROCESS(CLK_NUM1) BEGIN IF CLK_NUM139。 EVENT AND CLK_NUM1=39。 139。 THEN 每个字符需发送四个数据 IF C4=39。 139。 AND C2=39。 139。 AND C1=39。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。