您的当前位置:首页正文

VHDL课程设计报告

来源:一二三四网
VHDL课程设计报告

湖南科技⼤学信息与电⽓⼯程学院课程设计任务书20 —20 学年第学期专业:学号:姓名:课程设计名称:设计题⽬:

完成期限:⾃年⽉⽇⾄年⽉⽇共周设计依据、要求及主要内容(可另加附页):指导教师(签字):批准⽇期:年⽉⽇⽬录⼀、摘要

⼆、VHDL语⾔介绍三、设计的⽬的四、设计内容五、电路⼯作原理六、主要程序及仿真结果七、对本次设计的体会和建议⼋、参考⽂献⼀、摘要

⼈类社会已进⼊到⾼度发达的信息化社会。信息化社会的发展离不开电⼦信息产品开发技术、产品品质的提⾼和进步。电⼦信息产品随着科学技术的进步,其电⼦器件和设计⽅法更新换代的速度⽇新⽉异。实现这种进步的主要原因就是电⼦设计技术和电⼦制造技术的发展,其核⼼就是电⼦设计⾃动化(EDA,Electronics Design Automation)技术,EDA技术的发展和推⼴应⽤⼜极⼤地推动了电⼦信息产业的发展。为保证电⼦系统设计的速度和质量,适应“第⼀时间推出产品”的设计要求,EDA技术正逐渐成为不可缺少的⼀项先进技术和重要⼯具。⽬前,在国内电⼦技术教学和产业界的技术推⼴中已形成“EDA热”,完全可以说,掌握EDA技术是电⼦信息类专业学⽣、⼯程技术⼈员所必备的基本能⼒和技能。EDA技术在电⼦系统设计领域越来越普及,本设计主要利⽤VHDL语⾔设计⼀个电⼦数字钟,它的计时周期为24⼩时,显⽰满刻度为24时59分59秒。总的程序由⼏个各具不同功能的单元模块程序拼接⽽成,其中包括分频程序模块、时分秒计数和设置程序模块、⽐较器程序模块、三输⼊数据选择器程序模块、译码显⽰程序模块和拼接程序模块。并且使⽤软件进⾏电路波形仿真。关键词:数字钟EDA VHDL语⾔⼆、VHDL语⾔介绍

1987年底,VHDL被IEEE和美国国防部确认为标准硬件描述语⾔。⾃IEEE公布了VHDL的标准版本,IEEE-1076(简称87版)之后,各EDA公司相继推出了⾃⼰的VHDL 设计环境,或宣布⾃⼰的设计⼯具可以和VHDL接⼝。此后VHDL在电⼦设计领域得到了⼴泛的接受,并逐步取代了原有的⾮标准的硬件描述语⾔。1993年,IEEE对VHDL进⾏了修订,从更⾼的抽象层次和系统描述能⼒上扩展VHDL的内容,公布了新版本的VHDL,即IEEE标准的1076-1993版本,(简称93版)。现在,VHDL和Verilog作为IEEE的⼯业标准硬件描述语⾔,⼜得到众多EDA公司的⽀持,在电⼦⼯程领域,已成为事实上的通⽤硬件描述语⾔。有专家认为,在新的世纪中,VHDL于Verilog语⾔将承担起⼤部分的数字系统设计任务。VHDL主要⽤于描述数字系统的结构,⾏为,功能和接⼝。除了含有许多具有硬件特征的语句外,VHDL的语⾔形式和描述风格与句法是⼗分类似于⼀般的计算机⾼级语⾔。VHDL的程序结构特点是将⼀项⼯程设计,或称设计实体(可以是⼀个元件,⼀个电路模块或⼀个系统)分成外部(或称可是部分,及端⼝)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。在对⼀个设计实体定义了外部界⾯后,⼀旦其内部开发完成后,其他的设计就可以直接调⽤这个实体。这种将设计实体分成内外部分的概念是VHDL系

统设计的基本点。三、设计的⽬的

本项实验通过六⼗进制计数器和数字钟的设计与仿真,学习VHDL语⾔及VHDL⽂本输⼊设计⽅法,编写六⼗进制计数器和数字钟源程序,应⽤VMAX+plusII软件进HDL⽂本输⼊设计与波形仿真。熟练地运⽤数字系统的设计⽅法进⾏数字系统设计,能进⾏较复杂的数字系统设计,按要求设计⼀个数字钟。四、设计内容

1、60进制计数器计数器

60进制计数器计数器是⼀个⽤以实现计数功能的时序部件,它不仅可⽤来及脉冲数,还常⽤作数⼦系统的定时、分频和执⾏数字运算以及其它特定的逻辑功能。计数器种类很多。按

构成计数器中的各触发器是否使⽤⼀个时钟脉冲源来分,有同步计数器和异步计数器。2、数字钟显⽰秒、分、时,可清零、可调时,具有整点报时功能五、电路⼯作原理1、六⼗进制计数器

“秒计数器”采⽤60进制计数器,每累计60秒发出⼀个“分脉冲”信号,该信号将作为“分计数器”的时钟脉冲。“分计数器”也采⽤60进制计数器,每累计60分钟,发出⼀个“时脉冲”信号,该信号将被送到“时计数器”。2、数字钟

由⽯英晶体振荡器、分频器、计数器、译码器显⽰器和校时电路组成。振荡器产⽣稳定的⾼频脉冲信号,作为数字钟的时间基准,然后经过分频器输出标准秒脉冲。秒计数器满60后向分计数器进位,分计数器满60后向⼩时计数器进位,⼩时计数器按照“24翻1”规律计数。计数器的输出分别经译码器送显⽰器显⽰。计时出现误差时,可以⽤校时电路校时、校分。六、主要程序及仿真结果1、六⼗进制计数器LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY bcd60count IS

PORT(clk,bcd1wr,bcd10wr,cin:IN STD_LOGIC;co:OUT STD_LOGIC;

datain:IN STD_LOGIC_VECTOR(3 DOWNTO 0);bcd1:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);bcdSHI:OUT STD_LOGIC_VECTOR(2 DOWNTO 0));END ENTITY bcd60count;

ARCHITECTURE rtl OF bcd60count IS

SIGNAL bcd1n:STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL bcd10n:STD_LOGIC_VECTOR(2 DOWNTO 0);BEGINbcd1<=bcd1n;bcdSHI<=bcd10n;PROCESS(clk,bcd1wr)IS

BEGIN

IF(bcd1wr ='1')THENbcd1n<=datain;

ELSIF(clk 'EVENT AND clk='1')THENIF(cin='1')THENIF(bcd1n=9)THENbcd1n<=\"0000\";ELSE

bcd1n<=bcd1n+1;END IF;END IF;END IF;

END PROCESS;

PROCESS(clk,bcd10wr)ISBEGIN

IF(bcd10wr='1')THEN

bcd10n<=datain(2 DOWNTO 0);ELSIF(clk'EVENT AND clk='1')THENIF(cin='1'AND bcd1n=9)THENIF(bcd10n=5)THENbcd10n<=\"000\";ELSE

bcd10n<=bcd10n+1;END IF;END IF;END IF;

END PROCESS;

PROCESS(bcd10n,bcd1n,cin)ISBEGIN

IF(cin='1'AND bcd1n=9 AND bcd10n=5)THEN co<='1';ELSEco<='0';END IF;

END PROCESS;

END ARCHITECTURE rtl;

2、仿真结果

3、数字钟

use ieee.std_logic_1164.all;--顶层实体,⽤的是20Mhz的时钟use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity clock_shu isport(

clk : in std_logic;reset : in std_logic;

duan : out std_logic_vector(5 downto 0);data_o : out std_logic_vector(7 downto 0));end;

architecture a of clock_shu iscomponent count60port(

carry : std_logic;rst : std_logic;

times : out integer range 0 to 59;full : out std_logic);

end component;component count24port(

carry : in std_logic;rst : in std_logic;

times : out integer range 0 to 23--full : out std_logic);

end component;

component i60bcdport(

interg : in integer range 0 to 59;ten : out std_logic_vector(7 downto 0);one : out std_logic_vector(7 downto 0));

end component;component i24bcdport(

interg : in integer range 0 to 23;ten : out std_logic_vector(7 downto 0);one : out std_logic_vector(7 downto 0));

end component;

signal carry1,carry2 : std_logic;

signal abin1,abin2 : integer range 0 to 59;signal abin3 : integer range 0 to 23;signal clk_1h : std_logic;

signal sh,sl,mh,ml,hh,hl : std_logic_vector(7 downto 0); signal cnt : integer range 0 to 5 :=0; beginprocess(clk)--分频为1hz

constant counter_len:integer:=19999999;variable cnt:integer range 0 to counter_len;begin

if clk'event and clk='1' thenif cnt=counter_len thencnt:=0;elsecnt:=cnt+1;end if;case cnt is

when 0 to counter_len/2=>clk_1h<='0';when others =>clk_1h<='1';end case;end if;end process;

process(clk)

variable cnt1 : integer range 0 to 200;variable cnt2 : integer range 0 to 10;begin

if clk'event and clk='1' thenif cnt1=200 thencnt1:=0;if cnt2=10 thencnt2:=0;if(cnt=5)thencnt<=0;elsecnt<=cnt+1;end if;else

cnt2:=cnt2+1;end if;else

cnt1:=cnt1+1;end if;end if;end process;process(clk)beginif clk='1' thencase cnt is

when 0 => duan<=\"000001\";data_o<=sl;when 1 => duan<=\"000010\";data_o<=sh;when 2 => duan<=\"000100\";data_o<=ml;when 3 => duan<=\"001000\";data_o<=mh;when 4 => duan<=\"010000\";data_o<=hl;when 5 => duan<=\"100000\";data_o<=hh;when others=>duan<=\"000000\";end case;end if;

end process;

u1 : count60 port map(carry=>clk_1h,rst=>reset,times=>abin1,full=>carry1); u2 : count60 port

map(carry=>carry1,rst=>reset,times=>abin2,full=>carry2); u3 : count24 port map(carry=>carry2,rst=>reset,times=>abin3);u4 : i60bcd port map(interg=>abin1,ten=>sh,one=>sl);u5 : i60bcd port map(interg=>abin2,ten=>mh,one=>ml);u6 : i24bcd port map(interg=>abin3,ten=>hh,one=>hl);end;

use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity count60 is--分,秒计数器port(

carry : std_logic;rst : std_logic;

times : out integer range 0 to 59;full : out std_logic);end;

architecture a of count60 is

signal time_s : integer range 0 to 59;begin

process(rst,carry)beginif rst='1' thentime_s<=0;full<='0';

elsif rising_edge(carry) thenif time_s=59 thentime_s<=0;full<='1';else

time_s<=time_s+1;full<='0';end if;end if;end process;

times<=time_s;end; library ieee;

use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity count24 is--时计数器port(

carry : in std_logic;rst : in std_logic;

times : out integer range 0 to 23--full : out std_logic);end;

architecture a of count24 is

signal time_s : integer range 0 to 23;begin

process(rst,carry)beginif rst='1' thentime_s<=0;--full<='0';

elsif rising_edge(carry) thenif time_s=23 thentime_s<=0;--full<='1';else

time_s<=time_s+1;--full<='1';end if;end if;end process;times<=time_s;end; library ieee;

use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;

use ieee.std_logic_arith.all;entity i60bcd is--分,秒显⽰port(

interg : in integer range 0 to 59;ten : out std_logic_vector(7 downto 0);one : out std_logic_vector(7 downto 0));end;

architecture a of i60bcd isbegin

process(interg)begincase interg is

when 0|10|20|30|40|50 => one<=\"11000000\";when 1|11|21|31|41|51 => one<=\"11111001\";when 2|12|22|32|42|52 => one<=\"10100100\";when 3|13|23|33|43|53 => one<=\"10110000\";when 4|14|24|34|44|54 => one<=\"10011001\";when 5|15|25|35|45|55 => one<=\"10010010\";when 6|16|26|36|46|56 => one<=\"10000011\";when 7|17|27|37|47|57 => one<=\"11111000\";when 8|18|28|38|48|58 => one<=\"10000000\";when 9|19|29|39|49|59 => one<=\"10011000\";when others => one<=null;end case;case interg is

when 0|1|2|3|4|5|6|7|8|9 => ten<=\"11000000\"; when 10|11|12|13|14|15|16|17|18|19 => ten<=\"11111001\"; when

20|21|22|23|24|25|26|27|28|29 => ten<=\"10100100\"; when 30|31|32|33|34|35|36|37|38|39 => ten<=\"10110000\"; when

40|41|42|43|44|45|46|47|48|49 => ten<=\"10011001\"; when 50|51|52|53|54|55|56|57|58|59 => ten<=\"10010010\"; when others=> ten<=null;end case;end process;end;library ieee;

use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;

entity i24bcd is--时显⽰port(

interg : in integer range 0 to 23;ten : out std_logic_vector(7 downto 0);one : out std_logic_vector(7 downto 0));end;

architecture a of i24bcd isbegin

process(interg)begincase interg is

when 0|10|20 => one<=\"11000000\";when 1|11|21 => one<=\"11111001\";when 2|12|22 => one<=\"10100100\";when 3|13|23 => one<=\"10110000\";when 4|14 => one<=\"10011001\";when 5|15 => one<=\"10010010\";when 6|16 => one<=\"10000011\";when 7|17 => one<=\"11111000\";when 8|18 => one<=\"10000000\";when 9|19 => one<=\"10011000\";when others => one<=null;end case;case interg is

when 0|1|2|3|4|5|6|7|8|9 => ten<=\"11000000\"; when 10|11|12|13|14|15|16|17|18|19 => ten<=\"11111001\"; when 20|21|22|23=> ten<=\"10100100\"; when others => ten<=null;end case;end process;end;4、仿真结果

七、对本次设计的体会与建议

本设计原理简单,结构清晰,较为容易仿真成功。从本次课程设计中使我获益匪浅,⾸先使我对这门课程有了更深的体会,通过对60进制计数器的设计使我将以前所学的理论知识运⽤到实际中去,使⽤软件进⾏仿真,使我找到了很多以前没有完全理解的知识,通过再次查找资料,我⼜学会了很多。这次实验仿真了六⼗进制计数器,通过学习设计,初步掌握了软件的使⽤并且深⼊地体会到VHDL语⾔的⼴泛应⽤。这次实验让我感觉收获颇多,⼀⽅⾯培养了我⽤⾃⼰的专业知识解决问题的能⼒,进⼀步理解了理论必须运⽤于实际的重要性,加深了我对这门课程及专业知识的理解,对以后的⼯作学习⽣活都有很⼤的意义;另⼀⽅⾯我也发现⾃⼰很多的不⾜,对以前所学过的知识理解得不够深刻,掌握得不够牢固,这都是⾃⼰以后需要深⼊学习和克服的问题。在今后的学习中,我会发挥积极主动的精神,把所学知识与实践结合起来。⼋、参考⽂献

李晓敏,⽥熙燕. 基于VHDL语⾔的数字时钟设计[J].电⼦设计⼯程,2011,19(13):30-33. 朱晓红.基于EDA技术的数字钟设计与实现[J]. 电⼦设计⼯程,2011,19(4):170-172.

侯伯亨,刘凯,顾新 VHDL硬件描述语⾔与数字逻辑电路设计.2014,8

因篇幅问题不能全部显示,请点此查看更多更全内容

Top