用VHDL语言实现数字种的设计
entity lo_cov is
port( upd0 : in std_logic; //置数脉冲输入 f10 : in std_logic; //1khz时钟输入 f_clk : out std_logic; //分频时钟输出 lock : out std_logic_vector(2 downto 0) //输入脉冲的选择 ); end lo_cov;
以下是分频模块的仿真图像,
2.2 时分秒计数模块
时分秒可选用多进程或者单进程的方法,多进程速度快,但是结构复杂。故本设计选用单进程方法。当秒计数到59时向分进位,分计到59且秒为59时向时进位,当计到23时59分59秒时向天进位,同时对时分秒进行清零。程序中主要使用了if elsif end if;的语句。最后验证表明此设计方法可实现题目要求的功能。 以下是程序的实体部分
entity s_m_hour is port( clk0,clk1 : in std_logic; --clk0工作时钟,clk1预置脉冲 lock : in std_logic_vector(2 downto 0); //置数显示切换 s0,s1 : out std_logic_vector(3 downto 0); //秒的地位高位 m0,m1 : out std_logic_vector(3 downto 0); //分的低位高位 h0,h1 : out std_logic_vector(3 downto 0); //时的低位高位 co : out std_logic; --hour产生进位 en : in std_logic //使能端
用VHDL语言实现数字种的设计
); end s_m_hour; 以下是仿真的电路图
2.3时分秒置数模块
时分秒置数模块不同于计数模块,置数模块我选用了另一个置数时钟,也可
以说是置数脉冲。时分秒置数有使能端口en(高有效),置数使能端口tn,通过tn(tn=0时置数是减1模式,tn=1时是加1模式)判定是加1还是减1。当输入长度为三位的lock为101时对时进行置数,当lock为110时对分进行置数,当lock为111时对秒进行置数。
时分秒的置数实现方式可有多种方法,可用状态机,多进程和单进程等方法
实现,相比于别的设计方法,单进程的设计方法易于实现,没有复杂的对应关系,而且本功能的实现不许过于复杂的逻辑关系。本设计使用了单进程 内部使用嵌套的if elsif end if 语句实现预期的功能。以下是该功能的输入输出端口:
entity s_m_yuz1 is port( clk0,clk1 : in std_logic; --clk0工作时钟,clk1预置脉冲 lock : in std_logic_vector(2 downto 0); --置数选择 s0,s1 : out std_logic_vector(3 downto 0);--秒输入端口 m0,m1 : out std_logic_vector(3 downto 0);--分输入端口 h0,h1 : out std_logic_vector(3 downto 0);--时输入端口 tn : in std_logic; --tn=1预置数加1,tn=0预置数减1 en : in std_logic --使能端口,高有效 );
end s_m_yuz1;
用VHDL语言实现数字种的设计
以下分别是时分秒的置数仿真波形图
对时进行置数的功能仿真波形图
对分的置数的功能仿真波形图
对秒的置数的功能仿真波形图
2.4年月日计数模块
用VHDL语言实现数字种的设计
年月日的计数模块与时分秒的计数模块稍有不同,年月日需要考虑闰年2月
份的情况,闰年到来时2月份为29天,其他情况2月份为28天。本设计同样可采用多种设计方法,由于出现不同月份的天数有可能天数不一样的情况,故本设计采用状态机的设计方法实现,每个月份作为一个状态,采用了两个进程的设计方法,一个为组合逻辑设计,另一个为时序控制进程,已达到最优化,同时设计了进位脉冲,当计满12个月时向年产生进位,年数加1。以下是实体部分
entity daymony1 is port(
clk0,clk1 : in std_logic;
da0,da1 : out std_logic_vector(3 downto 0); mo0,mo1 : out std_logic_vector(3 downto 0); ya0,ya1 : out std_logic_vector(3 downto 0); co : out std_logic; --月向年产生进位的进位端 en : in std_logic; lock : in std_logic_vector(2 downto 0) ); end daymony1;
以下是年月日计数功能仿真波形
2.5年月日置数模块
年月日置数模块不同于时分秒的置数模块,在年月日的置数模块中我们需
要考虑闰年相对应的闰月的情况,就会出现不同的年份对应的2月的天数的不
用VHDL语言实现数字种的设计
同,其他的可将1,3,5,7,8,10,12归成一类,这几个月每个月的天数是31天,而4,6,9,11这几个月又归为一类,每个月有30天,二月分为特殊的一类,视是否为闰年而定天数,闰年有29天,非闰年为28天。En使能端,高有效。tn为置数模式的选择控制端,tn=1时置数处于加1模式,tn=0置数处于减1模式,lock为置数对象的选择。Lock=010时对年进行置数,lock=011时对月进行置数,lock=100时对天进行置数。
本设计对于本模块使用了单进程,内部使用了if elsif end if; 语句实现预
期的功能。以下是该置数模块的实体部分:
entity yuzhis is port(
clk1,tn : in std_logic; --clk1为置数时钟,tn=1置数处于加模式 en : in std_logic; --使能端口 lock : in std_logic_vector(2 downto 0); --置数的对象选择 da0,da1 : out std_logic_vector(3 downto 0); mo0,mo1 : out std_logic_vector(3 downto 0); ya0,ya1 : out std_logic_vector(3 downto 0) ); end yuzhis;
对年进行置数的功能仿真波形