
--*****************************************************************
--模块名 : 顶层设计
--文件名: myclock.vhd
--时间:2006年12月9日
--*********************************************************************
library ieee
use ieee.std_logic_1164.all
entity myclock is
port(clk1,clk2,reset:in std_logic --clk1为计数脉冲,clk2为LED扫描脉冲
hh_set:in std_logic_vector(1 downto 0)--时高位调整
mh_set,sh_set:in std_logic_vector(2 downto 0)--分,秒高位调整
hl_set,ml_set,sl_set:in std_logic_vector(3 downto 0) --时,分,秒低位调整
led_dp:out std_logic --LED小数点
sel:out std_logic_vector(2 downto 0) --送三-八译码生成位选信号
seg:out std_logic_vector(6 downto 0)) --段码
end myclock
architecture one of myclock is
component bclock is
port(clk,reset:in std_logic
hhin:in std_logic_vector(1 downto 0)
mhin,shin:in std_logic_vector(2 downto 0)
hlin, mlin,slin:in std_logic_vector(3 downto 0)
hho: out std_logic_vector(1 downto 0)
mho,sho:out std_logic_vector(2 downto 0)
hlo,mlo,slo:out std_logic_vector(3 downto 0))
end component bclock
component ledctrl is
port(clk:in std_logic
hh:in std_logic_vector(1 downto 0)
mh,sh:in std_logic_vector(2 downto 0)
hl,ml,sl:in std_logic_vector(3 downto 0)
dp:out std_logic
selo:out std_logic_vector(2 downto 0)
sego:out std_logic_vector(6 downto 0))
end component ledctrl
signal hh1:std_logic_vector(1 downto 0)
signal mh1,sh1:std_logic_vector(2 downto 0)
signal hl1,ml1,sl1:std_logic_vector(3 downto 0)
begin
u1:bclock port map(clk1,reset,hh_set,mh_set,sh_set,hl_set,ml_set,sl_set,hh1,mh1,sh1,hl1,ml1,sl1)
u2:ledctrl port map(clk2,hh1,mh1,sh1,hl1,ml1,sl1,led_dp,sel,seg)
end one
--*********************************************************************
--模块名 : 十进制数器
--文件名: counter10.vhd
--时间:2006年12月9日
--*********************************************************************
library ieee
use ieee.std_logic_1164.all
use ieee.std_logic_unsigned.all
entity counter10 is
port(clk,reset:in std_logic
din:in std_logic_vector(3 downto 0)
c:out std_logic
dout:out std_logic_vector(3 downto 0))
end counter10
architecture one of counter10 is
signal dd:std_logic_vector(3 downto 0)
signal c1:std_logic
begin
process(clk,reset) is
begin
if reset='1' then dd<=dinc1<='0'
elsif rising_edge(clk) then
if dd="1001" then dd<="0000"c1<='1'
else dd<=dd+1c1<='0'
end if
end if
end process
dout<=ddc<=c1
end one
--*****************************************************
--模块名 : 六进制计数器
--文件名: counter6.vhd
--时间:2006年12月9日
--******************************************************
library ieee
use ieee.std_logic_1164.all
use ieee.std_logic_unsigned.all
entity counter6 is
port(clk,reset:in std_logic
din:in std_logic_vector(2 downto 0)
c:out std_logic
dout:out std_logic_vector(2 downto 0))
end counter6
architecture one of counter6 is
signal dd:std_logic_vector(2 downto 0)
signal c1:std_logic
begin
process(clk,reset) is
begin
if reset='1' then dd<=dinc1<='0'
elsif rising_edge(clk) then
if dd="101" then dd<="000"c1<='1'
else dd<=dd+1c1<='0'
end if
end if
end process
dout<=ddc<=c1
end one
--*****************************************************
--模块名 : 二十四进制数器
--文件名: counter24.vhd
--时间:2006年12月9日
--******************************************************
library ieee
use ieee.std_logic_1164.all
use ieee.std_logic_unsigned.all
entity counter24 is
port(clk,reset:in std_logic
dhin:in std_logic_vector(1 downto 0)
dlin:in std_logic_vector(3 downto 0)
dh:out std_logic_vector(1 downto 0)
dl:out std_logic_vector(3 downto 0))
end counter24
architecture one of counter24 is
signal dl1:std_logic_vector(3 downto 0)
signal dh1:std_logic_vector(1 downto 0)begin
process(clk,reset) is
begin
if reset='1' then dl1<=dlindh1<=dhin
elsif rising_edge(clk) then
if dh1="10"and dl1="0011" then dl1<="0000"dh1<="00"
elsif dl1="1001" then dl1<="0000"dh1<=dh1+1
else dl1<=dl1+1
end if
end if
end process
dh<=dh1dl<=dl1
end one
--*******************************************************
--模块名 : 时钟模块
--文件名: bclock.vhd
--时间:2006年12月9日
--*******************************************************
library ieee
use ieee.std_logic_1164.all
use ieee.std_logic_unsigned.all
entity bclock is
port(clk,reset:in std_logic
hhin:in std_logic_vector(1 downto 0)
mhin,shin:in std_logic_vector(2 downto 0)
hlin, mlin,slin:in std_logic_vector(3 downto 0)
hho: out std_logic_vector(1 downto 0)
mho,sho:out std_logic_vector(2 downto 0)
hlo,mlo,slo:out std_logic_vector(3 downto 0))
end bclock
architecture one of bclock is
component counter10 is
port(clk,reset:in std_logic
din:in std_logic_vector(3 downto 0)
c:out std_logic
dout:out std_logic_vector(3 downto 0))
end component counter10
component counter6 is
port(clk,reset:in std_logic
din:in std_logic_vector(2 downto 0)
c:out std_logic
dout:out std_logic_vector(2 downto 0))
end component counter6
component counter24 is
port(clk,reset:in std_logic
dhin:in std_logic_vector(1 downto 0)
dlin:in std_logic_vector(3 downto 0)
dh:out std_logic_vector(1 downto 0)
dl:out std_logic_vector(3 downto 0))
end component counter24
signal csl,csh,cml,cmh:std_logic
begin
u1:counter10 port map(clk,reset,slin,csl,slo)
u2:counter6 port map(csl,reset,shin,csh,sho)
u3:counter10 port map(csh,reset,mlin,cml,mlo)
u4:counter6 port map(cml,reset,mhin,cmh,mho)
u5:counter24 port map(cmh,reset,hhin,hlin,hho,hlo)
end one
--******************************************************
--模块名 : LED扫描显示模块
--文件名:ledctrl.vhd
--时间:2006年12月9日
--*********************************************************
library ieee
use ieee.std_logic_1164.all
use ieee.std_logic_unsigned.all
use ieee.std_logic_arith.all
entity ledctrl is
port(clk:in std_logic
hh:in std_logic_vector(1 downto 0)
mh,sh:in std_logic_vector(2 downto 0)
hl,ml,sl:in std_logic_vector(3 downto 0)
dp:out std_logic
selo:out std_logic_vector(2 downto 0)
sego:out std_logic_vector(6 downto 0))
end ledctrl
architecture one of ledctrl is
signal ledon:std_logic_vector(3 downto 0)
signal count:std_logic_vector(2 downto 0)
begin
process(clk) is
begin
if rising_edge(clk) then
if count="101" then count<="000"
else count<=count+1
end if
end if
end process
selo<=count
ledon<=sl when count="000" else
'0'&sh when count="001" else
ml when count="010" else
'0'&mh when count="011" else
hl when count="100" else
"00"&hh when count="101" else
"000"
dp<='1' when count="010" or count="100" else
'0'
sego<="0111111" when ledon="0000" else
"0000110" when ledon="0001" else
"1011011" when ledon="0010" else
"1001111" when ledon="0011" else
"1100110" when ledon="0100" else
"1101101" when ledon="0101" else
"1111101" when ledon="0110" else
"0000111" when ledon="0111" else
"1111111" when ledon="1000" else
"1101111" when ledon="1001" else
"0000000"
end one
希望能帮到你...
FPGA开发平台、计算机、其它外接器件选题的意义:个人认为本项目(《数字时钟》)的选题意义有二,其一,时钟和闹钟早已是老生常谈的日常工具,利用课堂上所学习的知识贯通运用到现实生活中,作为 *** 作实践,具有一定的现实意义;其二,数字时钟的功能设计囊括了数码管、LCD屏、开关运用、管教分配等知识,能够对本学期所学的实验知识做一个挽接,在知识的总结上也具备一定意义;
功能要求:
1.用数码管显示时、分、秒:分为两个界面,即时钟界面以及闹钟设置界面,显示时钟的时分秒以及闹钟的时分秒,可以通过开关切换显示,是项目的基本功能;
2.能按比例缩短时间调试:调控时钟或闹钟的频跳速度,方便演示和调试;
3.闹钟功能:用户可以通过sw8切换进入闹钟界面,再利用sw1-3设定具体的闹钟时间,到点即响,同样是项目的基本功能;
4.用LCD屏显示日期(年月日)以及祝福语:作为时钟,显示年月日的功皮仔察能个人觉得也是有必要的,另外关于祝福语,我们对实验和知识的学习其实本身就是快乐的过程,生活也没有必要每天都过得毫无色彩、千篇一律,所以怀揣着这份情怀呢,我在本项目中加了一个显示祝福语的功能,意在表达自己的这份对科学和生活的热爱以及学习的热情。
系统结构图如下所示:
各模块的功能及端口介绍:
(这里的模块功能和端口做简要的介绍,详细的用法请移步至《设计思路》部分)
功能:顶层模块,调用其他子模块,统筹整个系统的功能;
端口:
clk_50M,//系统时钟燃茄输入
Reset_n,//系统复位输入
seg7, //数码管显示输出位
ledcom, //数码管位置调控输出位
key,//开关输入号位,主要使用于CLKcounter_60BCD
beep, //蜂鸣器输出信号
LCD_ON1,//LCD供电电源开关
LCD_BLON1, //LCD背景电源开关
LCD_RS1,//寄存器选择信号
LCD_RW1,//液晶读写信号
LCD_EN1,//液晶时钟信号
LCD_DATA1, //LCD的数据端口
功能:LCD屏显示控制模块,用于控制LCD屏显示年月日以及祝福语;
端口:
LCD_ON, //LCD供电电源开关
LCD_BLON, //LCD背景电源开关
LCD_RS, //寄存器选择信号
LCD_RW, //液晶读写信号
LCD_EN, //液晶时钟信号
LCD_DATA, //LCD的数据端口
CLK,//模块时钟输入(项目中输入的是clk_50M)
功能:基于视觉暂留知识,控制时钟界面数码管的显示;
端口:
clk,//模块时钟输入
rst_n, //复位信戚纯号输入
mimute_cnt, //分钟位数据输入
second_cnt, //秒位数据输入
hour_cnt, //时位数据输入
seg7, //数码管显示输出位
ledcom, //数码管位置调控输出位
功能:在顶层模块调用,根据输入的时钟和时|分|秒位数据进行对应的加一计算和进位计算,并在溢出(分秒59加一溢出,时23加一溢出)时返回一个flag供顶层模块使用;
端口:
clk,//模块时钟输入
rst,//复位信号输入
couter_o, //数字时钟部分的时|分|秒位数据输出
flag, //输出一个溢出进位标志
功能:对输入的50MHz的系统时钟分频,调用时根据CLK_DIV变量的复用情况进行运算并返回对应的时钟分频结果;
端口:
clk_in, //模块时钟输入,在顶层模块
rst,//复位信号输入
clk_out,//时钟分频结果输出
hour_cnt,CLKmimute_cnt,CLKsecond_cnt,CLKhour_cnt,ledcom,seg7,sw8)
功能:基于视觉暂留知识,控制闹钟设置界面数码管的显示,并基于sw8的状态控制切换数码管屏显示;
端口:
clk,//模块时钟输入
rst,//复位信号输入
mimute_cnt, //分钟位数据输入(时钟)
second_cnt, //秒位数据输入(时钟)
hour_cnt, //时位数据输入(时钟)
CLKmimute_cnt,//分钟位数据输入(闹钟设置)
CLKsecond_cnt,//秒位数据输入(闹钟设置)
CLKhour_cnt,//时位数据输入(闹钟设置)
seg7, //数码管显示输出位
ledcom, //数码管位置调控输出位
sw8 //开关8的输入信号
功能:在顶层模块调用,根据输入的时钟频率clk和时|分|秒位数据进行对应的加一计算和进位计算,并在溢出(分秒59加一溢出,时23加一溢出)时返回一个flag供顶层模块使用;
端口:
clk,//模块时钟输入
rst,//复位信号输入
couter_o, //数字闹钟设置部分的时|分|秒位数据输出
flag, //输出一个溢出进位标志
sw //开关输入位,作为key的接收变量
功能:顶层模块,调用其他子模块,统筹整个系统的功能;
思路:
A.复用两次分频模块clk_gen,产生两个速度不一样的时钟频——clk_second和clk_second2,分别用来驱动数字时钟和数字闹钟设置;
B.复用三次时钟控制模块counter_60BCD:
第一次,用clk_second作为时钟频输入,传入second_cnt给couter_o作为秒位数据承载,MODULEofCNT设置为60,模块每溢出一次(即每计数到60个秒),产生一个flag,即flag_min;
第二次,用flag_min作为时钟频输入,传入minute_cnt给couter_o作为秒位数据承载,MODULEofCNT设置为60,模块每溢出一次(即每计数到60个分),产生一个flag,即flag_hour;
第三次,用flag_hour作为时钟频输入,传入hour_cnt给couter_o作为秒位数据承载,MODULEofCNT设置为24,模块每计数到24个时溢出一次;
C.复用三次闹钟控制模块CLKcounter_60BCD:
第一次,用clk_second2作为时钟频输入,传入CLKsecond_cnt给couter_o作为秒位数据承载,MODULEofCNT设置为60,sw位传入key[2]信号,即sw3的状态信号;
第二次,用clk_second2作为时钟频输入,传入CLKminute_cnt给couter_o作为秒位数据承载,MODULEofCNT设置为60,sw位传入key[1]信号,即sw2的状态信号;
第三次, 用clk_second2作为时钟频输入,传入CLKhour_cnt给couter_o作为秒位数据承载,MODULEofCNT设置为24,sw位传入key[0]信号,即sw1的状态信号;
D.复用LCD屏控制显示模块lcd_ori,根据本函数定义的变量复用对应的参数;
E.复用闹钟数码管控制显示模块CLKseg_display,根据本函数定义的变量复用对应的参数;
F.接下来,编写了一个状态机,主要设置并使用了state0、state1、state2等三个状态;
state0状态:使用if判断语句
if(second_cnt==CLKsecond_cnt&&minute_cnt==CLKminute_cnt&&hour_cnt==CLKhour_cnt)
等一个在闹钟界面模块设置的时分秒数列,等到这个数列的时候转跳到state1或state2,并设置好蜂鸣器鸣响的延时时间到变量cnt_2;
state1、state2:在计数变量cnt_2归零之前,一直给蜂鸣器管脚输出高电平,直到计数变量cnt_2归零,输出为低电平,停止蜂鸣器鸣响;
功能:LCD屏显示控制模块,用于控制LCD屏显示年月日以及祝福语;
思路:
A.将年月日以及祝福语分别编写成字符串,再分别付给变量lcd_buf_first、data_first和lcd_buf_second、data_second;
B.准备好状态参数常量——
clear_lcd、
set_disp_mode、
disp_on、
shift_down、
write_data_first、
write_data_second;
基于状态机思想,并用current_state变量承载状态常量;
C.初始化LCD模块;
D.clear_lcd状态, 清屏并光标复位 ;
set_disp_mode: 设置显示模式:8位2行5x8点阵;
disp_on: 显示器开、光标不显示、光标不允许闪烁 ;
shift_down: 文字不动,光标自动右移;data_first赋值给lcd_buf_first
write_data_first、write_data_second: 用于写入数据
default: 若current_state为其他值,则将current_state置为clear_lcd;
功能:基于视觉暂留知识,控制时钟界面数码管的显示;
思路:
A.复用分频模块clk_gen分频出一个时钟clk_div,周期约为0.1s;
B.设置一个8位的变量cnt,基于clk_div进行递加一,并在0到满位溢出之间循环(满位溢出时将之归零,再继续加一处理);
C.基于快速递加一的变量cnt,在每个clk时钟上升沿来的是时候,取其低三位(八个数码管格位,刚好三位二进制数可以完整表示)进行case处理,
每个case的子状态中,根据cnt低三位的值,把对应的表示数码管位置的二进制数赋值给ledcom,用于选择数码管格位;再把对应的数据(如秒位数据的低四位second_cnt[3:0],高四位second_cnt[7:4]等)传给dis变量;dis的用法是在下一个always模块里面,case判断dis的值,根据dis的值把对应的二进制数传给seg7变量,用于基于ledcom选择数码管格位之后,显示格位里面的内容;
由此,基于快速跳变的clk时钟和clk_div时钟,ledcom的值也不断地快速变换,由此数码管的每个格位都在被快速地选择和显示,于是这样便是通过了视觉暂留效应,实现了数码管时钟的显示;
功能:在顶层模块调用,根据输入的时钟和时|分|秒位数据进行对应的加一计算和进位计算,并在溢出(分秒59加一溢出,时23加一溢出)时返回一个flag供顶层模块使用;
思路:
A.将MODULEofCNT(分别通过/10和%10运算)切成5/2和9/3两个数,并分别付给变量a和b;
B.通过a和b判断是对分秒位数据(MODULEofCNT为60)还是对时位数据(MODULEofCNT为24)进行计算;
若是分秒位数据:先对couter_o[7:4]进行判断,若小于5,则对couter_o[3:0]判断,若couter_o[3:0]小于9,则couter_o[3:0]数据加一,若couter_o[3:0]不小于于9,则couter_o[3:0]归零处理,couter_o[7:4]加一;若couter_o[7:4]不小于5,则对couter_o[3:0]判断,若couter_o[3:0]小于a(9),则couter_o[3:0]数据加一,若couter_o[3:0]不小于于a(9),则couter_o八个位都归零,并返回一个溢出进位flag(flag<=1);
若是时位数据:逻辑同上,只将b替换为2,将a替换为3进行处理即可;
功能:对输入的50MHz的系统时钟分频,调用时根据CLK_DIV变量的复用情况进行运算并返回对应的时钟分频结果;
思路:简单地基于系统时钟clk_in以及可复用的参数CLK_DIV实现分频的功能;
hour_cnt,CLKmimute_cnt,CLKsecond_cnt,CLKhour_cnt,ledcom,seg7,sw8)
功能:基于视觉暂留知识,控制闹钟设置界面数码管的显示,并基于sw8的状态控制切换数码管屏显示;
思路:
A.复用分频模块clk_gen分频出一个时钟clk_div,周期约为0.1s;
B.(基于sw8的状态控制切换数码管屏显示)If语句判断sw8时候为高电平,如果是,则将CLKsecond_cnt、CLKmimute_cnt、CLKhour_cnt系列数据付给dis变量,如果不是则将second_cnt系统数据付给dis变量;细节处如cnt、ledcom、dis、case(cnt[2:0])等用法则跟seg_display模块的设计思路相同;
功能:在顶层模块调用,根据输入的时钟频率clk和时|分|秒位数据进行对应的加一计算和进位计算,并在溢出(分秒59加一溢出,时23加一溢出)时返回一个flag供顶层模块使用;
思路:同counter_60BCD模块的设计思路;
1.开机状态,初始为数字时钟界面,下图为数码管上规则地显示闪动的时钟,通过分频模块的参数调改可以改变其速度;
LCD屏上显示具体的日期(年月日)以及祝福语(Wish you happy/happiness——祝你幸福),开关状态为全数低电平:
2.上推sw8,令之输出为高电平,数码管即切换到闹钟设置界面:
4.上推sw2,令之输出为高电平,数码管闹钟界面上“分”数位持续加一(图中已加到04):
5.上推sw3,令之输出为高电平,数码管闹钟界面上“秒”数位持续加一(图中已加到05):
顶层文件,用于调用诸多要使用的模块;
管教分配的脚本文件,描述管教的分配;
LCD屏模块,实现LCD屏显示年月日以及祝福语的功能;
时钟模块的数码管显示的相关模块文件;
关于实现时钟界面显示的后台数字计算(相关变量的加一和进位 *** 作等)的文件;
时钟分频模块,用于实现各种参数频率的分频;
闹钟模块的数码管管显示的相关模块文件;
关于实现闹钟界面显示的后台数字计算(相关变量的加一和进位 *** 作等)的文件。
module d_asyn(clk,clr,d,q)//模块输入输出口,共四个信号,每个都是1bit的input clk,clr,d //这些是作为输入
output q//这些是作为输出
reg q//q在作为寄存器类的输出,就是说可以用<= 箭头赋悔凳值(见下面)
always @(posedge clr) //posedge:上升沿。就是说在clr信号的上升沿的时候都会触发这个旅物 *** 作
begin //可拆前液以忽略,就是多条语句在一块的时候要用
q<=0 //清0
end
always @(necedge clk) //negedge:下降沿,你肯定拼错了 ,在clk下降沿的时候触发
begin
#10 q<=d //延迟10个单位,这个在#timescale那里定义,这个只在仿真的时候有用,在器件上的时候不能这样做延迟
end
endmodule
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)