名称:基于FPGA的电子日历控制电路设计VHDL代码Quartus仿真(文末获取)
软件:Quartus
语言:VHDL
代码功能:
任务及要求
硬件描述语言VHDL是一种用形式化方法描述数字电路和系统的语言。利用这种语言,数字电路系统的设计可以从上层到下层(从抽象到具体)逐层描述自己的设计思想,用一系列分层次的模块来表示复杂的数字系统。然后,利用电子设计自动化(EDA)工具,逐层进行仿真验证。设计一个用于电子时钟的控制电路,功能要求如下
1.用BCD码输出显示当前日期,显示格式“年月日”及“星期几”
2.月和日可手动调整,星期应随之自动变化;
3.无需考虑闰年。
1. 工程文件
2. 程序文件
3. 程序编译
4. RTL图
5. testbench
6. 仿真图
整体仿真图
大小月判断模块
控制模块
二进制转BCD模块
部分代码展示:
LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_unsigned.all; --万年历 ENTITY calendar IS PORT ( CLK : IN STD_LOGIC; RST : IN STD_LOGIC; --月日调整按键 day_add : IN STD_LOGIC;--天加 day_sub : IN STD_LOGIC;--天减 month_add : IN STD_LOGIC;--月加 month_sub : IN STD_LOGIC;--月减 year_h_bcd_H : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--BCD码-年千位 year_h_bcd_L : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--BCD码-年百位 year_l_bcd_H : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--BCD码-年十位 year_l_bcd_L : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--BCD码-年个位 month_bcd_H : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--BCD码-月十位 month_bcd_L : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--BCD码-月个位 day_bcd_H : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--BCD码-天十位 day_bcd_L : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--BCD码-天个位 week_bcd : OUT STD_LOGIC_VECTOR(3 DOWNTO 0) --BCD码-星期 ); END calendar; ARCHITECTURE behave OF calendar IS --大小月判断 component month_day IS PORT ( CLK : IN STD_LOGIC;--时钟 RST : IN STD_LOGIC;--复位 month : IN STD_LOGIC_VECTOR(3 DOWNTO 0);--月 day_max : OUT STD_LOGIC_VECTOR(4 DOWNTO 0)--月最大天数 ); END component; --万年历控制模块 component calendar_ctrl IS PORT ( CLK : IN STD_LOGIC; RST : IN STD_LOGIC; --月日调整按键 day_add : IN STD_LOGIC;--天加 day_sub : IN STD_LOGIC;--天减 month_add : IN STD_LOGIC;--月加 month_sub : IN STD_LOGIC;--月减 day_max : IN STD_LOGIC_VECTOR(4 DOWNTO 0);----月最大天数 year_h : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);--年高位 year_l : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);--年低位 month : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--月 week : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--星期 day : OUT STD_LOGIC_VECTOR(4 DOWNTO 0)--天 ); END component; --二进制转BCD码 component BCD IS PORT ( clk : IN STD_LOGIC; binary : IN STD_LOGIC_VECTOR(7 DOWNTO 0);--二进制输入 Tens : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--十位 Ones : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)--个位 ); END component; SIGNAL day_max : STD_LOGIC_VECTOR(4 DOWNTO 0):="00000"; SIGNAL year_h : STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL year_l : STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL month : STD_LOGIC_VECTOR(7 DOWNTO 0):="00000000"; SIGNAL day : STD_LOGIC_VECTOR(7 DOWNTO 0) :="00000000"; SIGNAL week : STD_LOGIC_VECTOR(3 DOWNTO 0);--星期 BEGIN --大小月判断 U_month_day: month_day PORT MAP( CLK =>CLK,--时钟 RST =>RST,--复位 month =>month(3 DOWNTO 0),--月 day_max =>day_max--月最大天数 ); --万年历控制模块 U_calendar_ctrl: calendar_ctrl PORT MAP( CLK =>CLK,--时钟 RST =>RST,--复位 --月日调整按键 day_add =>day_add,--天加 day_sub =>day_sub,--天减 month_add =>month_add,--月加 month_sub =>month_sub,--月减 day_max =>day_max,----月最大天数 year_h =>year_h,--年高位 year_l =>year_l,--年低位 month =>month(3 DOWNTO 0),--月 week =>week,--星期 day =>day(4 DOWNTO 0)--天 ); --二进制转BCD码 year_h_BCD: BCD PORT MAP( clk =>CLK,--时钟 binary =>year_h,--二进制输入 Tens =>year_h_bcd_H,--十位 Ones =>year_h_bcd_L --个位 ); --二进制转BCD码 year_l_BCD: BCD PORT MAP( clk =>CLK,--时钟 binary =>year_l,--二进制输入 Tens =>year_l_bcd_H,--十位 Ones =>year_l_bcd_L --个位 );
源代码
扫描文章末尾的公众号二维码