eda数字秒表设计程序vhdl结论(eda课程设计数字秒表)
本篇文章给大家谈谈eda数字秒表设计程序vhdl结论,以及eda课程设计数字秒表对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
数字钟设计 用VHDL语言实现 你怎么做的
源代码如下 自己把各个模块打好包 下面有个图 自己看看
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY TZKZQ IS
PORT(KEY: IN STD_LOGIC_VECTOR(1 DOWNTO 0); --按键信号
CLK_KEY: IN STD_LOGIC; --键盘扫描信号
MAX_DAYS:IN STD_LOGIC_VECTOR(4 DOWNTO 0); --本月最大天数
SEC_EN,MIN_EN,HOUR_EN,DAY_EN,MON_EN,YEAR_EN,WEEK_EN:OUT STD_LOGIC; --异步并行置位使能
HOUR_CUR:IN STD_LOGIC_VECTOR(4 DOWNTO 0);
MIN_CUR,SEC_CUR:IN STD_LOGIC_VECTOR(5 DOWNTO 0);
YEAR_CUR:IN STD_LOGIC_VECTOR(6 DOWNTO 0);
MON_CUR :IN STD_LOGIC_VECTOR(3 DOWNTO 0);
DAY_CUR :IN STD_LOGIC_VECTOR(4 DOWNTO 0);
WEEK_CUR:IN STD_LOGIC_VECTOR(2 DOWNTO 0);
SEC,MIN:BUFFER STD_LOGIC_VECTOR(5 DOWNTO 0);
HOUR:BUFFER STD_LOGIC_VECTOR(4 DOWNTO 0);
DAY :BUFFER STD_LOGIC_VECTOR(4 DOWNTO 0);
MON :BUFFER STD_LOGIC_VECTOR(3 DOWNTO 0);
YEAR:BUFFER STD_LOGIC_VECTOR(6 DOWNTO 0);
WEEK:BUFFER STD_LOGIC_VECTOR(2 DOWNTO 0));
END ENTITY TZKZQ;
ARCHITECTURE ART OF TZKZQ IS
TYPE STATETYPE IS (NORMAL,SEC_SET,MIN_SET,HOUR_SET,DAY_SET,MON_SET,
YEAR_SET,WEEK_SET);
SIGNAL MODE:STATETYPE;
BEGIN
PROCESS(KEY,CLK_KEY)
BEGIN
IF CLK_KEY'EVENT AND CLK_KEY='1' THEN
IF KEY="01" THEN
SEC_EN='1';MIN_EN='1';HOUR_EN='1';
DAY_EN='1';MON_EN='1';YEAR_EN='1';
WEEK_EN='1';
CASE MODE IS
WHEN NORMAL = MODE=SEC_SET;SEC=SEC_CUR;SEC_EN='0';
WHEN SEC_SET = MODE=MIN_SET;MIN=MIN_CUR;SEC_EN='1';MIN_EN='0';
WHEN MIN_SET = MODE=HOUR_SET;HOUR=HOUR_CUR;MIN_EN='1';HOUR_EN='0';
WHEN HOUR_SET= MODE=DAY_SET;DAY=DAY_CUR;HOUR_EN='1';DAY_EN='0';
WHEN DAY_SET = MODE=MON_SET;MON=MON_CUR;DAY_EN='1';MON_EN='0';
WHEN MON_SET = MODE=YEAR_SET;YEAR=YEAR_CUR; MON_EN='1';
YEAR_EN='0';
WHEN YEAR_SET = MODE=WEEK_SET;WEEK=WEEK_CUR;YEAR_EN='1';WEEK_EN='0';
WHEN WEEK_SET = MODE=NORMAL;
END CASE;
ELSIF KEY="10" THEN --如果按下调整键,则自加
CASE MODE IS
WHEN SEC_SET = SEC_EN='0';
--异步并行置位使能有效
IF SEC="111011" THEN SEC="000000";
--如果秒计数到59,返回到0重新计数
ELSE SEC=SEC+1; --否则继续计数
END IF;
WHEN MIN_SET = MIN_EN='0';
IF MIN="111011" THEN MIN="000000";
ELSE MIN=MIN+1;
END IF;
WHEN HOUR_SET= HOUR_EN='0';
IF HOUR="11000" THEN HOUR="00000";
ELSE HOUR=HOUR+1;
END IF;
WHEN DAY_SET = DAY_EN='0';
IF DAY=MAX_DAYS THEN DAY="00001";
ELSE DAY=DAY+1;
END IF;
WHEN WEEK_SET= WEEK_EN='0';
IF WEEK="111" THEN WEEK="001";
ELSE WEEK=WEEK+1;
END IF;
WHEN OTHERS=NULL;
END CASE;
END IF;
END IF;
END PROCESS;
END ARCHITECTURE ART;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CNT60 IS
PORT(LD: IN STD_LOGIC;
CLK: IN STD_LOGIC;
DATA: IN STD_LOGIC_VECTOR(5 DOWNTO 0);
NUM: BUFFER STD_LOGIC_VECTOR(5 DOWNTO 0);
CO: OUT STD_LOGIC);
END ENTITY CNT60;
ARCHITECTURE ART OF CNT60 IS
BEGIN
PROCESS(CLK,LD) IS
BEGIN
IF(LD='0') THEN
NUM=DATA;
ELSIF CLK'EVENT AND CLK='1' THEN
IF NUM="111011" THEN --59
NUM="000000";CO='1';
ELSE
NUM=NUM+1;CO='0';
END IF;
END IF;
END PROCESS;
END ARCHITECTURE ART;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CNT60 IS
PORT(LD: IN STD_LOGIC;
CLK: IN STD_LOGIC;
DATA: IN STD_LOGIC_VECTOR(5 DOWNTO 0);
NUM: BUFFER STD_LOGIC_VECTOR(5 DOWNTO 0);
CO: OUT STD_LOGIC);
END ENTITY CNT60;
ARCHITECTURE ART OF CNT60 IS
BEGIN
PROCESS(CLK,LD) IS
BEGIN
IF(LD='0') THEN
NUM=DATA;
ELSIF CLK'EVENT AND CLK='1' THEN
IF NUM="111011" THEN --59
NUM="000000";CO='1';
ELSE
NUM=NUM+1;CO='0';
END IF;
END IF;
END PROCESS;
END ARCHITECTURE ART;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CNT24 IS
PORT(LD: IN STD_LOGIC;
CLK: IN STD_LOGIC;
DATA: IN STD_LOGIC_VECTOR(4 DOWNTO 0);
NUM: BUFFER STD_LOGIC_VECTOR(4 DOWNTO 0);
CO: OUT STD_LOGIC);
END ENTITY CNT24;
ARCHITECTURE ART OF CNT24 IS
BEGIN
PROCESS(CLK,LD) IS
BEGIN
IF(LD='0') THEN
NUM=DATA;
ELSIF CLK'EVENT AND CLK='1' THEN
IF NUM="11000" THEN --24
NUM="00000";CO='1';
ELSE
NUM=NUM+1;CO='0';
END IF;
END IF;
END PROCESS;
END ARCHITECTURE ART;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CNT30 IS
PORT(LD:IN STD_LOGIC;
CLK:IN STD_LOGIC;
NIAN:IN STD_LOGIC_VECTOR(6 DOWNTO 0);
YUE :IN STD_LOGIC_VECTOR(3 DOWNTO 0);
DATA:IN STD_LOGIC_VECTOR(4 DOWNTO 0);
NUM:BUFFER STD_LOGIC_VECTOR(4 DOWNTO 0);
MAX_DAYS:OUT STD_LOGIC_VECTOR(4 DOWNTO 0);
CO:OUT STD_LOGIC);
END ENTITY CNT30;
ARCHITECTURE ART OF CNT30 IS
SIGNAL TOTAL_DAYS:STD_LOGIC_VECTOR(4 DOWNTO 0);
BEGIN
PROCESS(CLK,LD) IS
VARIABLE IS_RUNNIAN:STD_LOGIC;
BEGIN
CASE NIAN IS
WHEN "0000000" = IS_RUNNIAN:='1'; --0
WHEN "0000100" = IS_RUNNIAN:='1'; --4
WHEN "0001000" = IS_RUNNIAN:='1'; --8
WHEN "0001100" = IS_RUNNIAN:='1'; --12
WHEN "0010000" = IS_RUNNIAN:='1'; --16
WHEN "0010100" = IS_RUNNIAN:='1'; --20
WHEN "0011000" = IS_RUNNIAN:='1'; --24
WHEN "0011100" = IS_RUNNIAN:='1'; --28
WHEN "0100000" = IS_RUNNIAN:='1'; --32
WHEN "0100100" = IS_RUNNIAN:='1'; --36
WHEN "0101000" = IS_RUNNIAN:='1'; --40
WHEN "0101100" = IS_RUNNIAN:='1'; --44
WHEN "0110000" = IS_RUNNIAN:='1'; --48
WHEN "0110100" = IS_RUNNIAN:='1'; --52
WHEN "0111000" = IS_RUNNIAN:='1'; --56
WHEN "0111100" = IS_RUNNIAN:='1'; --60
WHEN "1000000" = IS_RUNNIAN:='1'; --64
WHEN "1000100" = IS_RUNNIAN:='1'; --68
WHEN "1001000" = IS_RUNNIAN:='1'; --72
WHEN "1001100" = IS_RUNNIAN:='1'; --76
WHEN "1010000" = IS_RUNNIAN:='1'; --80
WHEN "1010100" = IS_RUNNIAN:='1'; --84
WHEN "1011000" = IS_RUNNIAN:='1'; --88
WHEN "1011100" = IS_RUNNIAN:='1'; --92
WHEN "1100000" = IS_RUNNIAN:='1'; --96
WHEN OTHERS = IS_RUNNIAN:='0';
END CASE;
CASE YUE IS
WHEN "0001" = TOTAL_DAYS="11111"; --1
WHEN "0011" = TOTAL_DAYS="11111"; --3
WHEN "0101" = TOTAL_DAYS="11111"; --5
WHEN "0111" = TOTAL_DAYS="11111"; --7
WHEN "1000" = TOTAL_DAYS="11111"; --8
WHEN "1010" = TOTAL_DAYS="11111"; --10
WHEN "1100" = TOTAL_DAYS="11111"; --12
WHEN "0100" = TOTAL_DAYS="11110"; --4
WHEN "0110" = TOTAL_DAYS="11110"; --6
WHEN "1001" = TOTAL_DAYS="11110"; --9
WHEN "1011" = TOTAL_DAYS="11110"; --11
WHEN "0010" =
IF (IS_RUNNIAN='1') THEN
TOTAL_DAYS="11101";
ELSE
TOTAL_DAYS="11100";
END IF;
WHEN OTHERS=NULL;
END CASE;
IF(LD='0') THEN
NUM=DATA;
ELSIF CLK'EVENT AND CLK='1' THEN
MAX_DAYS=TOTAL_DAYS;
IF NUM=TOTAL_DAYS THEN --99
NUM="00001";CO='1';
ELSE
NUM=NUM+1;CO='0';
END IF;
END IF;
END PROCESS;
END ARCHITECTURE ART;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CNT7 IS
PORT(LD: IN STD_LOGIC;
CLK: IN STD_LOGIC;
DATA: IN STD_LOGIC_VECTOR(2 DOWNTO 0);
NUM: BUFFER STD_LOGIC_VECTOR(2 DOWNTO 0));
END ENTITY CNT7;
ARCHITECTURE ART OF CNT7 IS
BEGIN
PROCESS(CLK,LD) IS
BEGIN
IF(LD='0') THEN
NUM=DATA;
ELSIF CLK'EVENT AND CLK='1' THEN
IF NUM="111" THEN --7
NUM="000";
ELSE
NUM=NUM+1;
END IF;
END IF;
END PROCESS;
END ARCHITECTURE ART;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CNT12 IS
PORT(LD: IN STD_LOGIC;
CLK: IN STD_LOGIC;
DATA: IN STD_LOGIC_VECTOR(3 DOWNTO 0);
NUM: BUFFER STD_LOGIC_VECTOR(3 DOWNTO 0);
CO: OUT STD_LOGIC);
END ENTITY CNT12;
ARCHITECTURE ART OF CNT12 IS
BEGIN
PROCESS(CLK,LD) IS
BEGIN
IF(LD='0') THEN
NUM=DATA;
ELSIF CLK'EVENT AND CLK='1' THEN
IF NUM="1100" THEN --12
NUM="0000";CO='1';
ELSE
NUM=NUM+1;CO='0';
END IF;
END IF;
END PROCESS;
END ARCHITECTURE ART;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CNT99 IS
PORT(LD: IN STD_LOGIC;
CLK: IN STD_LOGIC;
DATA: IN STD_LOGIC_VECTOR(6 DOWNTO 0);
NUM: BUFFER STD_LOGIC_VECTOR(6 DOWNTO 0));
END ENTITY CNT99;
ARCHITECTURE ART OF CNT99 IS
BEGIN
PROCESS(CLK,LD) IS
BEGIN
IF(LD='0') THEN
NUM=DATA;
ELSIF CLK'EVENT AND CLK='1' THEN
IF NUM="1100011" THEN --12
NUM="0000000";
ELSE
NUM=NUM+1;
END IF;
END IF;
END PROCESS;
END ARCHITECTURE ART;
eda秒表程序
1.
“分分:秒秒”计数器设计
我们要实现“分分:秒秒”显示的电子秒表,需要设计计数频率为1Hz
的
计数器。因为“分分:秒秒”的结构对应有4个十进制数字(个位的秒,十位的
秒,个位的分,十位的分),如果采用统一计数再分别求出“分分:秒秒”
对应
的4个十进制数字进行译码显示,则求解对应的4个十进制数字的过程难于用硬
件实现。在此,我们将每个显示的值分别进行计数,即分别针对个位的秒、十位
的秒、个位的分、十位的分设计对应的计数器,其中个位的秒计数频率为1Hz,
其从0到9计数,当从9回到0时,向前进一位,使得十位的秒进行计数加1。
35
十位的秒从0到5计数,当从5回到0时,向前进一位,使得个位的分进行计数
加1。个位的分从0到9计数,当从9回到0
时,向前进一位,使得十位的分进
行计数加1。十位的分则从0
到5计数,计数到5时,又回到0。
2.
扫描显示技术
因为4位数码管的段控制输入是复用的,要分别显示不同的计数数值,需要
使用动态扫描显示技术,其电路结构如图61
所示。首先,以扫描显示的频率进
行2比特宽的模4计数,然后由其值从4个数码管的待显示值输入中选择对应的
一个经译码后连接到公共的段控制输入端,同时将计数值经2到4译码后输出到
对应数码管位的公共端,点亮对应的数码管。虽然各数码管位是轮流显示,每个
数码管位上的数字是断续的显示,只要扫描的频率够快,由于人眼的视觉残余效
应,就可以看到各数码管位上稳定的数字显示值。这和我们使用的电视、显示器
的显示原理是一样的。参考液晶显示器的刷新频率,经验证,在每秒钟扫描60
帧的时候,各数码管位上即能得到稳定的数字显示,此时,对应计数时钟的等效
频率为240Hz。我们可以参考实验四的图47,再做一个等效分频计数器,通过
产生的后级时钟使能信号将20MHz的时钟等效分频到240Hz。
图
61
扫描显示电路结构
3.
冒号点的处理
数码管中间的时间分隔冒号点(对应为左边第2个数码管位的DP点)每秒
钟闪烁一次,其频率为1Hz,只需要输出1Hz,占空比为50%的周期信号即可。
其他数码管位的点号不需要显示,对应的DP
点输出低电平无效信号即可。这4
个信号
所示的显示切换计数值进行4
选1
选择后接到数码管上公共的
DP控制端。
在实验四中,我们为了得到1Hz的主功能计数频率,前面利用precnt
进行了等效分频计数,其一个完整的计数周期即为1s,对应产生的使能信号en
频率即为1Hz,但我们在此不能直接使用en
的信号,因为其占空比只有
1/20000000,肉眼无法看到其闪烁的效果。为得到占空比为50%的1Hz信号,我
们可以通过对precnt
的计数值进行比较得出,只需要在precnt
计数周期内一半的
时间输出1,一半的时间输出0
即可,例如,当precnt25'd9999999
时输出0,
否则输出1,此时即可得到占空比为50%的1Hz信号。
4.
总体设计
总体设计只需要将时钟电路、复位电路、按键电路、数码管电路等组合起来,
综合使用时钟使能的同步设计技术、按键处理技术、扫描显示技术、“分分:秒
秒”计数器设计技术及冒号点的处理技术即可。
秒表的VHDL语言设计程序!
用vhdl设计秒表全功略!
根据要求, 秒表的设计要有三个输入端:runstop,rst和clk. runstop是开关, 按一下开始计时, 再按一下停止计时, 显示时间. 可以使用一个T触发器来实现. 当我们把T触发器的T端接高电平时, 它将实现翻转功能. 然后用输入端口runstop 来控制, 当runstop 被按一下, 一个时钟到来, T触发器就进行一次翻转. 我们也可以用D触发器来代替T触发器, 需要用一个反馈信号, 将输出的信号反馈到D端口. Rst 是复位, 当按下rst 时, 秒表的显示变为0. Clk是时钟, 实验中的时钟信号是250KHZ,为了实现秒表的正确计时功能, 需要进行2500分频. 所以clk首先就应该接到一个分频器, 然后再为其他模块提供时钟. 接着我们把秒表划分为以下几个模块:分频器, 计数器, T触发器, 扫描器, 八选一选择器, 七段译码器, 另外还有一个模块要在分, 秒和毫秒之间做一个划分(BAR). 计数器的功能是要实现毫秒,秒,分的计数,比较麻烦.我们再将它分成几个模块, 可以是六进制的计数器和十进制的计数器进行级联来实现.也可以是用100进制的计数器和60进制的计数器进行级联. 我两种方法都尝试了一下.发现后一种方法编程要复杂的多, 级联的时候可以稍微简单一些. 因为D触发器,八选一选择器是程序包里有的,所以可以不编. 把这些模块都编好了以后要做的就是把他们连在一起. 有两种方法. 一是用画图的方法, 二是用编程的方法, 用port map语句. 同样, 这两种方法我也都尝试了. 我觉得用画图的方法要简单一些.
1程序如下:分频器: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity df is port(clkin:in std_logic; dout:out std_logic);
end; architecture behavioral of df is begin process(clkin) variable df: std_logic_vector(7 downto 0):="00000000"; begin if (clkin'event and clkin='1')then if df/="11111010" then df:=df+1; else df:="00000001"; end if; end if; dout=df(7); end process; end behavioral; 扫描器: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;
entity scan is port(clk:in std_logic; s:out std_logic_vector(2 downto 0)); end scan;
architecture behavioral of scan is variable scan:std_logic_vector(2 downto 0); begin process(clk) begin if(clk'event and clk='1')then scan:=scan+1; end if; s=scan; end process; end behavioral; 七段译码器: library ieee; use ieee.std_logic_1164.all;
entity bcd is port(o:in std_logic_vector(3 downto 0); q:out std_logic_vector(6 downto 0)); end bcd ;
architecture behavioral of bcd is begin process(o) begin case o is when"0000"=q="0111111"; when"0001"=q="0000110"; when"0010"=q="1011011"; when"0011"=q="1001111"; when"0100"=q="1100110"; when"0101"=q="1101101"; when"0110"=q="1111101"; when"0111"=q="0100111"; when"1000"=q="1111111"; when"1001"=q="1101111"; when others=q="0000000"; end case; end process; end behavioral; 当然,以上的100进制和60进制计数器的设计过于复杂,可以由六进制和十进制的计数器级联代替,程序如下:六进制: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity c6 is port(count:out std_logic_vector(3 downto 0); cout:out std_logic; cin,rst,clk:in std_logic); end c6; architecture behavioral of c6 is signal counter:std_logic_vector(2 downto 0); begin process(clk,rst) begin if rst='1'then counter="000";cout='0'; elsif clk'event and clk='1' then if cin='1' then if counter="101"then counter="000";cout='1'; else counter=counter+"001"; cout='0'; end if; end if; end if; end process; count(2 downto 0)=counter; count(3)='0'; end behavioral;
十进制: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;
entity c10 is port(count:out std_logic_vector(3 downto 0); cout:out std_logic; cin,rst,clk:in std_logic); end c10;
architecture behavioral of c10 is signal counter:std_logic_vector(3 downto 0); begin process(clk,rst) begin if rst='1'then counter="0000";cout='0'; elsif clk'event and clk='1' then if cin='1' then if counter="1001"then counter="0000";cout='1'; else counter=counter+"0001"; cout='0'; end if; end if; end if; end process; count=counter; end behavioral;
最后用画图讲这些模块连接起来.
关于eda数字秒表设计程序vhdl结论和eda课程设计数字秒表的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。