《计算机组成原理》课程设计报告基于VHDL的楼梯照明灯的控制的实现.doc
1 引 言以前进行楼梯照明灯的控制,需要进行模拟电路和数字电路设计,使用的芯片多,电路复杂,出现问题不易查找,不易进行功能扩展。随着EDA(Electronics Design Automation)技术的出现,改变了传统的设计电路的方法,人们可以用一片芯片实现所需要的各种功能,这就是可编程逻辑器件。与传统电路设计方法相比,可编程逻辑器件功能强大,开发过程投资小、周期短,可反复编程修改,保密性极好,开发工具智能化等特点,特别是随着电子工艺的不断改进,低成本FPGAICPLD器件推陈出新,促使FPGAICPLD成为当今硬件设计的首选方式之一。EDA关键技术之一就是采用硬件描述语言对硬件电路进行描述,且具有系统级仿真和综合能力。目前应用比较广泛的硬件描述语言就是VHDL(Very High speed lntegrated Circuit Hardware Description language)。图1.12 VHDL简介 VHDL的英文全名是Very-High-Speed Integrated Circuit HardwareDescription Language,诞生于1982年。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语言是一种用于电路设计的高级语言。它在80年代的后期出现。最初是由美国国防部开发出来供美军用来提高设计的可靠性和缩减开发周期的一种使用范围较小的设计语言 。 VHDL的英文全写是:VHSIC(Very High Speed Integrated Circuit)Hardware Description Language.翻译成中文就是超高速集成电路硬件描述语言。因此它的应用主要是应用在数字电路的设计中。目前,它在中国的应用多数是用在FPGA/CPLD/EPLD的设计中。当然在一些实力较为雄厚的单位,它也被用来设计ASIC。VHDL主要用于描述数字系统的结构,行为,功能和接口。除了含有许多具有硬件特征的语句外,VHDL的语言形式、描述风格以及语法是十分类似于一般的计算机高级语言。VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可视部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。由于VHDL已经成为IEEE标准所规范的硬件描述语言,目前大多数EDA工具几乎都支持VHDL,这为VHDL的进一步推广和广泛应用奠定了基础。在硬件电路设计过程中,主要的设计文件是用VHDL编写的源代码,因为VHDL易读和结构化,所以易于修改设计。VHDL具有多层次的设计描述功能,既可以描述系统级电路,又可以描述门级电路。而描述既可以采用行为描述、寄存器传输描述或结构描述,也可以采用三者混合的混合级描述。另外,VHDL支持惯性延迟和传输延迟,还可以准确地建立硬件电路模型。VHDL支持预定义的和自定义的数据类型,给硬件描述带来较大的自由度,使设计人员能够方便地创建高层次的系统模型。3任务描述及要求3.1用VHDL语言描述楼梯灯试设计一个楼梯灯控制装置。控制要求:只用一个按钮控制,当按一次按钮时,楼梯灯亮4min后自动熄灭;当连续按二次按钮时,灯长亮不灭;无论是定时状态,还是灯长亮状态,只要按下按钮的时间超过2s时灯熄灭(注意如果按下时间不超过2s,原状态继续)。该控制器框图如图1所示。状态机的状态图如图2所示。假设:KEY=1表示按钮按下,KEY=0表示按钮跳起。TD2=1表示2s时间到。TD240=1表示240s时间到。ST_2=1表示启动2s定时器。ST_240=1 表示启动240s定时器。 LAMP=1表示灯亮。从该状态机的特点可以看出,这是一个梅里状态机,这是因为只要按钮一按下,一些动作就立刻开始执行,而不是等到状态转移后,例如当按钮按下,两秒定时器就开始工作。图3.1 楼梯灯控制装置框图3.2实验步骤:在单独的文件夹中建立项目、输入各个底层VHDL源文件、仿真;建立顶层电路图源文件,将各个底层描述形成模块符号、连接电路、锁定引脚、编译、下载到实验板、观察结果。 图3.2 楼梯灯的状态图4状态机的VHDL描述:library ieee;use ieee.std_logic_1164.all;entity fsm isport(key,clk,td2,td240 :in std_logic; st2,st240,lamp :out std_logic);end;architecture fsm_arch of fsm istype zt_type is (s1,s2,s3,s4,s5,s6,s7,s8,s9);signal zt_now, zt_next : zt_type;beginn1:process(clk) -状态寄存进程 begin if clk'event and clk='1' then zt_now<=zt_next; end if; end process;n2:process(key,zt_now) -次态逻辑和梅里输出 begin case zt_now is when s1=> if key='1' then lamp<='1'st240<='1'st2<='0'zt_next<=s2; elsif key='0' then lamp<='0'st240<='0'st2<='0'zt_next<=s1; end if; when s2=> if key='0' then lamp<='1'st240<='1'st2<='1'zt_next<=s3; elsif key='1' then lamp<='1'st240<='1'st2<='0'zt_next<=s2; end if; when s3=> if key='1' then lamp<='1'st240<='1'st2<='0'zt_next<=s7; elsif (key='0') and (td2='1') then lamp<='1'st240<='1'st2<='1'zt_next<=s4; else lamp<='1'st240<='1'st2<='1'zt_next<=s3; end if; when s4=> if key='1' then lamp<='1'st240<='1'st2<='1'zt_next<=s5; elsif (key='0') and (td240='1') then lamp<='0'st240<='1'st2<='0'zt_next<=s1; else lamp<='1'st240<='1'st2<='0'zt_next<=s4; end if; when s5=> if (key='1') and (td2='1') then lamp<='0'st240<='0'st2<='1'zt_next<=s6; elsif key='0' then lamp<='1'st240<='1'st2<='0'zt_next<=s4; else lamp<='1'st240<='1'st2<='1'zt_next<=s5; end if; when s6=> if key='0' then lamp<='0'st240<='0'st2<='0'zt_next<=s1; else lamp<='0'st240<='0'st2<='0'zt_next<=s6; end if; when s7=> if key='1' then lamp<='1'st240<='0'st2<='1'zt_next<=s8; else lamp<='1'st240<='0'st2<='0'zt_next<=s7; end if; when s8=> if (key='1') and (td2='1') then lamp<='0'st240<='0'st2<='1'zt_next<=s9; elsif (key='0') then lamp<='1'st240<='1'st2<='0'zt_next<=s7; else lamp<='1'st240<='0'st2<='1'zt_next<=s8; end if; when s9=> if key='0' then lamp<='0'st240<='0'st2<='0'zt_next<=s1; else lamp<='0'st240<='0'st2<='0'zt_next<=s9; end if; when others =>zt_next<=s1; end case;end process;end fsm_arch;该状态机的仿真结果如图4.1-1所示。240s时间到灭灯2s时间到进s3按键第1次按下按键连续按下2次,进入长亮状态s6按键按下1次,进入定时状态s3按键按下时间超过2s,进入s5灭灯按键按下超过2s,进入状态s8灭灯图4.1状态机仿真图5 2秒计数器的VHDL描述 library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity con2 isport(clk,st2 :in std_logic; td2 :out std_logic; sh :out std_logic_vector(3 downto 0);end;architecture con2_arch of con2 issignal qq: std_logic_vector(3 downto 0);begin process(clk,st2) begin if st2='0' then qq<="0011"-题目要求是2秒,为调试方便这里给3秒 elsif clk'event and clk='1' then if qq/="0000" then qq<=qq-1; else qq<=qq; end if; end if; end process; td2<='1' when qq="0000" else '0' sh<=qq;end con2_arch;2秒减计数器的仿真结果如图5.1所示。图5.1 2秒减计数器的仿真结果6 240秒计数器的VHDL描述library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity con240 isport(clk,st240 :in std_logic; td240 :out std_logic; gaowei,diwei:out std_logic_vector(3 downto 0);end;architecture con240_arch of con240 issignal qq: std_logic_vector(7 downto 0);begin process(clk,st240) begin if st240='0' then qq<="00011110"-题目要求是240秒,为调试方便这里给30秒 elsif clk'event and clk='1' then if qq/="00000000" then qq<=qq-1; else qq<=qq; end if; end if; end process; td240<='1' when qq="00000000" else '0' gaowei<=qq(7 downto 4); diwei<=qq(3 downto 0); end con240_arch; 本计数器采用十六进制计数器,仿真结果如图6.1所示。图6.1 240秒计数器仿真结果7译码器的VHDL实现library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity yima isport( aa :in std_logic_vector(3 downto 0); b0,b1,b2,b3,b4,b5,b6 :out std_logic);end;architecture yima_arch of yima issignal bb: std_logic_vector(6 downto 0);beginprocess(aa) begin case aa is when "0000" => bb <= "0000001"when "0001" => bb <= "1001111"when "0010" => bb <= "0010010"when "0011" => bb <= "0000110"when "0100" => bb <= "1001100"when "0101" => bb <= "0100100"when "0110" => bb <= "0100000"when "0111" => bb <= "0001111" when "1000" => bb <= "0000000"when "1001" => bb <= "0000100"when "1010" => bb <= "0001000"when "1011" => bb <= "1100000"when "1100" => bb <= "0110001"when "1101" => bb <= "1000010"when "1110" => bb <= "0110000"when "1111" => bb <= "0111000" when others => bb <= "1111111"end case;end process; b0<=bb(6); b1<=bb(5); b2<=bb(4); b3<=bb(3); b4<=bb(2); b5<=bb(1); b6<=bb(0);end yima_arch; 该译码器是十六进制七段译码,用于共阳极数码管,仿真结果如图7.1所示。图7.1 译码器仿真结果8分频电路library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity fenpin isport(clk :in std_logic; q0,q1,q2,q3 :out std_logic);end;architecture fenpin_arch of fenpin issignal qq :std_logic_vector(3 downto 0);begin process(clk) begin if clk'event and clk='1' then qq<=qq+1; end if; q0<=qq(0); q1<=qq(1); q2<=qq(2); q3<=qq(3); end process;end fenpin_arch;该分频器是十六分频计数器,仿真结果如图8.1所示。图8.1十六分频计数器仿真结果图9顶层模块图顶层模块如图9.1所示。仿真结果如图9.2图9.1 楼道灯顶层模块图按钮按下,灯亮,30秒后灯灭按钮按下,用按下时间延长2s的方式灭灯按钮按下2次,灯常亮,用按下时间延长2s的方式灭灯图9.2 楼道灯顶层模块仿真结果10参考文献 1 ARMSTRONG J R, FRAY F G. VHDL设计表示和综合M.李宗伯,王蓉晖译.北京:机械工业出版社, 2002. 2 SKAHILL K.可编程逻辑系统的VHDL设计技术M.朱明程,孙普译.南京:东南大学出版社,1998. 3 仇玉章. 微型计算机系统接口技术M. 南京:江苏科技出版社,1997. 4电脑知识与技术J2010年6月刊5软件世界J2010年8月刊11致谢在这两周的课程设计中,蔡老师,郭祥斌同学还有其他很同学对我给予了不少帮助,在此特意对他们表示感谢!