名称:基于FPGA的自动数字日历设计VHDL代码ISE SEED-XDTK_MBoard开发板
软件:ISE
语言:VHDL
代码功能:
自动数字日历设计
在实验二的基础上,设计自动数字日历,用七段数字显示器显示年(后2位)、月、日和星期数,在计日脉冲的作用下,自动完成1-12月的月、日及星期的计数和显示。
FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
本代码已在SEED-XDTK_MBoard开发板验证,SEED-XDTK_MBoard开发板如下,其他开发板可以修改管脚适配:
演示视频:
设计文档:
1. 工程文件
2. 程序文件
3. 管脚分配
4. 程序编译
5. Testbench
6. 仿真图
部分代码展示:
LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_unsigned.all; use ieee.std_logic_arith.all; ENTITY calendar IS PORT ( sysclk : IN STD_LOGIC;--时钟 reset_n : IN STD_LOGIC;--复位 year_H : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--年十位 year_L : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--年个位 month_H : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--月十位 month_L : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--月个位 day_H : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--日十位 day_L : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--日个位 week_L : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)--星期 ); END calendar; ARCHITECTURE RTL OF calendar IS --2进制转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 year : STD_LOGIC_VECTOR(7 DOWNTO 0) := "00001000"; SIGNAL month : STD_LOGIC_VECTOR(3 DOWNTO 0) := "0001"; SIGNAL day : STD_LOGIC_VECTOR(4 DOWNTO 0) := "11110"; SIGNAL week : STD_LOGIC_VECTOR(3 DOWNTO 0) := "0001"; SIGNAL leap_month : STD_LOGIC;--闰月 signal div_cnt:Integer RANGE 0 to 100000; SIGNAL day_pulse : STD_LOGIC; --日脉冲 SIGNAL month_ex : STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL day_ex : STD_LOGIC_VECTOR(7 DOWNTO 0); BEGIN PROCESS (sysclk) BEGIN IF (sysclk'EVENT AND sysclk = '1') THEN IF (div_cnt >= 100) THEN--仿真是将100000改小为100 --IF (div_cnt >= 100000) THEN--上板测试时为100000 div_cnt <= 0; day_pulse <= '1';--1秒变一次 ELSE div_cnt <= div_cnt + 1; day_pulse <= '0'; END IF; END IF; END PROCESS; --闰月判断 PROCESS (day, month , year) BEGIN IF ((day = "11100") AND NOT(((year(1 DOWNTO 0) = "00" AND year /= "00000000"))) AND (month = "0010")) THEN leap_month<='1'; ELSIF((day = "11101") AND ((year(1 DOWNTO 0) = "00" AND year /= "00000000")) AND (month = "0010"))THEN leap_month<='1'; ELSIF((day = "11110") AND ((month = "0100") OR (month = "0110") OR (month = "1001") OR (month = "1011")) )THEN leap_month<='1'; ELSIF((day = "11111") AND ((month = "0001") OR (month = "0011") OR (month = "0101") OR (month = "0111") OR (month = "1000") OR (month = "1010") OR (month = "1100")))THEN leap_month<='1'; ELSE leap_month<='0'; END IF; END PROCESS; PROCESS (sysclk, reset_n) BEGIN IF ((NOT(reset_n)) = '1') THEN--复位 day <= "00001";--1日 month <= "0001";--1月 year <= "00001010";--10 ELSIF (sysclk'EVENT AND sysclk = '1') THEN IF (day_pulse = '1') THEN IF (leap_month = '1') THEN day <= "00001"; IF (month = "1100") THEN month <= "0001"; IF (year = "01100011") THEN year <= "00000000"; ELSIF (month = "1100") THEN year <= year + "00000001"; END IF; ELSIF (leap_month = '1') THEN month <= month + "0001"; END IF; ELSE day <= day + "00001"; END IF; END IF; END IF; END PROCESS;
点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=788
阅读全文
543