定时器VHDL设计_第1页
定时器VHDL设计_第2页
定时器VHDL设计_第3页
定时器VHDL设计_第4页
定时器VHDL设计_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 可编程ASIC设计 200711523 朱红霞定时器 1.实验任务设计要求:整体清零;可以定时最高到99min;以秒速度递增至预定时间,以分速度递减至零。 总体框图如下图所示: clr 用来整体复位清零;clk 提供了秒信号,频率为1HZ(在仿真中取10MHZ);clky 是用来扫描输出的,选用频率大于50HZ的方波(为便于观察结果,在仿真中取10MHZ);set是用来置位的,低电平时有效,将以秒的速度,从零递增到所需定时的时间,为高电平时以分的速度递减,实现定时,直到零,定时结束;alm 输出高电平,可启动各种电路或发出警报。时间的变化都将在数码管上显示出来。 2.模块及模块功能 模块AA

2、A见下图示。它是核心模块,用来实现定时器的逻辑功能,计数结果用十进制数输出。LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_unsigned.all;ENTITY aaa IS PORT(clk, clr, set: in std_logic; alm: out std_logic; q1,q0: out std_logic_vector(3 downto 0);END aaa;ARCHITECTURE aaa_arc OF aaa ISBEGIN PROCESS (clk,clr) variable cnt1,cnt

3、0:std_logic_vector(3 downto 0); variable cnt: integer range 0 to 59; BEGIN IF clr='0' THEN -整体复位 alm<='0' cnt:=0; cnt1:="0000" cnt0:="0000" ELSIF clk'EVENT AND clk='1' THEN -设计数初值 IF set='0' THEN cnt:=0; IF cnt0<"1001" THEN cnt0

4、:=cnt0+1; ELSE cnt0:="0000" IF cnt1<"1001" THEN cnt1:=cnt1+1; ELSE cnt1:="0000" END IF; END IF; ELSE IF cnt<59 THEN -60分频 cnt:=cnt+1; ELSE cnt:=0; IF cnt0>"0000" THEN cnt0:=cnt0-1; IF cnt1="0000" AND cnt0="0000" THEN -判断计时是否结束 alm&

5、lt;='1' END IF; ELSE cnt0:="1001" IF cnt1>"0000" THEN cnt1:=cnt1-1; ELSE cnt1:="1001" END IF; END IF; END IF; END IF; END IF; q0<=cnt0; q1<=cnt1; END PROCESS;END aaa_arc; 模块CH如下图示。由于只用了两个数码管,所以片选信号直接接一个较快的时钟。此模块的功能是对应片选信号,送出要显示的数据。LIBRARY ieee;USE ieee.

6、std_logic_1164.all;ENTITY ch IS PORT(sel:in std_logic; a1,a0:in std_logic_vector(3 downto 0); q:out std_logic_vector(3 downto 0);END ch;ARCHITECTURE ch_arc OF ch ISBEGIN PROCESS(sel,a0,a1) BEGIN IF sel='0' THEN q<=a0; ELSE q<=a1; END IF; END PROCESS;END ch_arc; 模块DISP如下图示。该模块为七段译码器。LIB

7、RARY ieee; USE ieee.std_logic_1164.all;ENTITY disp IS PORT(a:in std_logic_vector(3 downto 0); q:out std_logic_vector(6 downto 0);END disp;ARCHITECTURE disp_arc OF disp ISBEGIN PROCESS(a) BEGIN CASE a IS WHEN "0000"=>q<="0111111" WHEN "0001"=>q<="0000110

8、" WHEN "0010"=>q<="1011011" WHEN "0011"=>q<="1001111" WHEN "0100"=>q<="1100110" WHEN "0101"=>q<="1101101" WHEN "0110"=>q<="1111101" WHEN "0111"=>q<=&

9、quot;0000111" WHEN "1000"=>q<="1111111" WHEN "1001"=>q<="1101111" WHEN others=>q<="0000000" END CASE; END PROCESS;END disp_arc; 3.仿真结果分析总体仿真结果如下:由图可见,clr =0可实现整体复位功能。set =0,输出以秒的速度从零递增。 本图中当递增到26后,set =1,输出经60分频后以分的速度递减,实现定时,直到

10、零,定时结束。定时结束后,clm =1,此时可启动各种电路或发出报警,定时结束。clr =0,整体复位,clm =0。该设计采用动态扫描电路,经过二选一模块将结果显示出来。从上图可见,q交替输出两位结果。sel=1时输出高位,sel=0时输出低位。自动售货机控制器一、设计一个自动售货机的控制电路。该自动售货机销售价格为25美分的糖果,利用有限状态机进行电路设计。控制器的输入输出如图所示: 输入信号是nickel_in(投入5美分),dime_in(投入10美分),quarter_in(投入25美分)。另外两个必要的输入是clk(时钟)和rst(复位)。控制器相应的有3个输出:candy_out

11、用于控制发放糖果, nickel_out用于控制找回5美分的零钱, dime_out用于控制找回10美分的零钱。025510152040453035ninininiqiqiqiqiqinododino+codo+cocodidididini自动售货机控制器的顶层电路图和状态转移图信号说明:ni=nickel_in, di=dime_in, qi=quarter_in, no=nickel_out, do=dime_out, co=candy_out 上图给出了有限状态机的状态转移图。圆圈里的数代表顾客投进来的总钱数(接受5美分、10美分或25美分的硬币)。状态0是空闲状态。从它开始,如果投入5

12、美分硬币,将跳转到状态5;如果投入10美分硬币,将跳转到状态10;如果投入25美分硬币,将跳转到状态25。随着投币数量的增加,状态不断跳转,如果投入的币值达到25美分,就可以进入状态25,然后售货机会发放糖果,并跳转回状态0。如果投入的币值超过了25美分,那么售货机要进入与找零钱相关的状态。例如,当投入的币值达到40美分时,需要先退出5美分硬币(进入状态35),然后再退出10美分,发放糖果并进入状态0。二、该设计的VHDL源码如下:在代码中定义了枚举类型state,它包含10个状态,所以至少需要用4位对其进行编码(将产生4个寄存器)。在默认状态下,编译器将按照它们的排列顺序对其进行编码,所以有

13、st0=”0000”(十进制的0),st5=”0001”(十进制的1),和st45=”1001”(十进制的9)。在仿真中,这些数字将替代状态的名称出现在仿真波形中。 LIBRARY ieee;USE ieee.std_logic_1164.all;ENTITY vending_machine IS PORT (clk, rst:IN STD_LOGIC; nickel_in, dime_in, quarter_in: IN BOOLEAN; candy_out, nickel_out, dime_out: OUT STD_LOGIC);END vending_machine;ARCHITECT

14、URE fsm OF vending_machine IS TYPE state IS(st0,st5,st10,st15,st20,st25,st30,st35,st40,st45); SIGNAL present_state,next_state: STATE;BEGIN PROCESS(rst,clk) BEGIN IF(rst='1') THEN present_state<=st0; ELSIF (clk'EVENT AND clk='1') THEN present_state<=next_state; END IF; END P

15、ROCESS; PROCESS(present_state, nickel_in, dime_in, quarter_in) BEGIN CASE present_state IS WHEN st0=> candy_out<='0' nickel_out<='0' dime_out<='0' IF(nickel_in) THEN next_state<=st5; ELSIF(dime_in) THEN next_state<=st10; ELSIF(quarter_in) THEN next_state<

16、=st25; ELSE next_state<=st0; END IF; WHEN st5=> candy_out<='0' nickel_out<='0' dime_out<='0' IF(nickel_in) THEN next_state<=st10; ELSIF(dime_in) THEN next_state<=st15; ELSIF(quarter_in) THEN next_state<= st30; ELSE next_state<=st5; END IF; WHEN st10

17、=> candy_out<='0' nickel_out<='0' dime_out<='0' IF(nickel_in) THEN next_state<=st15; ELSIF(dime_in) THEN next_state<=st20; ELSIF(quarter_in) THEN next_state<=st35; ELSE next_state<=st10; END IF; WHEN st15=> candy_out<='0' nickel_out<=&

18、#39;0' dime_out<='0' IF(nickel_in) THEN next_state<=st20; ELSIF(dime_in) THEN next_state<=st25; ELSIF(quarter_in) THEN next_state<=st40; ELSE next_state<=st15; END IF; WHEN st20=> candy_out<='0' nickel_out<='0' dime_out<='0' IF(nickel_in

19、) THEN next_state<=st25; ELSIF(dime_in) THEN next_state<=st30; ELSIF(quarter_in) THEN next_state<=st45; ELSE next_state<=st20; END IF; WHEN st25=> candy_out<='1' nickel_out<='0' dime_out<='0' next_state<=st0; WHEN st30=> candy_out<='1'

20、 nickel_out<='1' dime_out<='0' next_state<=st0; WHEN st35=> candy_out<='1' nickel_out<='0' dime_out<='1' next_state<=st0; WHEN st40=> candy_out<='0' nickel_out<='1' dime_out<='0' next_state<=st35;

21、WHEN st45=> candy_out<='0' nickel_out<='0' dime_out<='1' next_state<=st35; END CASE; END PROCESS;END fsm;三、仿真结果分析仿真结果如下图示:由上图可以看到:第一个周期内,一共投入了3个5美分硬币和1个25美分硬币。在第一个5美分硬币投进去后的第一个时钟上升沿出现时,有限状态机的状态从st0(十进制的0)转到了st5(十进制的1)。在投入第二个5美分硬币后状态转到st10(十进制的2),投入第二个5美分硬币后状态转到

22、st15(十进制的3),在25美分硬币投进去以后,状态变为st40(十进制的8)。此后,售货机退还顾客一个5美分硬币(nickle_out=1),同时状态机进入st35(十进制的7),接着退还10美分硬币(dime_out=1)并发放糖果(candy_out=1),同时状态回到空闲状态(st0)。其他输入组合的分析同上。二、2. 设计帧同步检测电路,输入位宽1位的二进制序列及时钟,输出高电平脉冲的检测结果。对输入的二进制序列检测帧同步序列“01011”,即当输入的二进制序列中出现帧同步序列时,输出一个高电平脉冲。(1).设计原理用状态机,状态转换图如下图示: State/YX 状态转换图各状态

23、定义如下:S0:空闲状态或仅输入“1”; S1:输入一个“0”后的状态;S2:输入序列“01”后的状态;S3:输入序列“010”后的状态;S4:输入序列“0101”后的状态;S5:输入帧同步序列“01011”后的状态,此时输出一个高电平脉冲。管脚图管脚说明:CLK时钟信号;X输入二进制序列;Y输出变量。(2).VHDL源程序:LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;USE ieee.std_logic_unsigned.all;ENTITY check IS PORT(clk,x:in std_

24、logic; y:out std_logic);END check;ARCHITECTURE check_arc OF check IStype state is(s0,s1,s2,s3,s4,s5);signal present_state:state;signal next_state:state;BEGIN s:PROCESS(clk) BEGIN IF clk'event and clk='1' THEN present_state<=next_state; END IF; END PROCESS s; c:PROCESS(x,present_state)

25、 BEGIN case present_state is when s0 => y<='0' if x='0' then next_state<=s1; else next_state<=s0; end if; when s1 => y<='0' if x='1' then next_state<=s2; else next_state<=s1; end if; when s2 => y<='0' if x='0' then next_st

26、ate<=s3; else next_state<=s0; end if; when s3 => y<='0' if x='1' then next_state<=s4; else next_state<=s1; end if; when s4 => y<='0' if x='1' then next_state<=s5; else next_state<=s3; end if; when s5 => y<='1' if x='1

27、9; then next_state<=s0; else next_state<=s1; end if; when others=>null; end case; END PROCESS c;END check_arc; (3).仿真结果及其分析 仿真结果如下图示:仿真结果分析:由以上截图可以看到,当输入的二进制序列x=“01011”,即检测到帧同步序列时,y输出一个高电平脉冲。且由第三个图可见,当clk取Hz时,输出有12.6ns/12.8ns的延时。二、3. 设计可以对两个运动员赛跑计时的秒表,要求如下:(1)秒表的输入只有时钟(clk)和一个按键(key),假设key已

28、经经过防抖动和脉冲宽度处理,每按一次key产生持续一个时钟周期的高电平脉冲,可以满足设计的需要,不需要对key再做任何处理。 (2)秒表输出用059的整数表示,不需要对十位和个位分别计数,不需要7段译码。 (3)键key的功能如下:(A) 按第一下key,开始计数,并输出计数值;(B) 第一个运动员到终点时按第二下key,秒表记住第一个运动员到终点的时间,但还在继续计数并输出计数值;(C) 第二个运动员到终点时按第三下key,停止计数,这时输出的计数值就是第二个运动员用的时间;(D) 然后按第四下key,秒表输出第一个运动员到终点的时间,即按第二下key时记住的计数值;(E) 按第五下key,

29、秒表清0,开始新的周期。(4)画出秒表的状态转移图,标明各个状态的转移条件和输出。(5)用VHDL完成秒表的设计。(1). 设计原理:该设计的状态转移图如下:S0/0S1/countS2/countS3/T2S4/T1S5/0Key=1Key=1Key=1Key=1Key=1Key=1=1Key=0Key=0Key=0Key=0Key=0Key=0其中,S0:空闲状态,输出为0;S1:第一个key按下后的状态,输出计数值;S2:第二个key按下后的状态,输出计数值,并记下第一个运动员到达终点的时间;S3:第三个key按下后的状态,输出第二个运动员所用时间;S4:第四个key按下后的状态,输出第

30、一个运动员所用时间;S5:第五个key按下后的状态,输出清零。(2). VHDL源程序如下:LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;USE ieee.std_logic_unsigned.all;ENTITY second IS PORT(clk,key:in std_logic; count:out integer range 0 to 59);END second;ARCHITECTURE second_arc OF second IStype state is(s0,s1,s2,s3,s4

31、,s5);signal present_state:state;signal next_state:state;BEGIN h:PROCESS(key) BEGIN IF key='1' THEN present_state<=next_state; END IF; END PROCESS h; s:PROCESS(present_state) BEGIN CASE present_state IS WHEN s0 => next_state<=s1; WHEN s1 => next_state<=s2; WHEN s2 => next_st

32、ate<=s3; WHEN s3 => next_state<=s4; WHEN s4 => next_state<=s5; WHEN s5 => next_state<=s1; WHEN others => null; END CASE; END PROCESS s; c:PROCESS(clk,present_state) variable c1,c2:integer range 0 to 59; BEGIN IF clk'event and clk='1' THEN case present_state is whe

33、n s0 => c1:=0; c2:=0; count<=0; when s1 => c1:=c1+1; c2:=c2+1; count<=c1; when s2 => c2:=c2+1; count<=c2; when s3 => count<=c2; when s4 => count<=c1; when s5 => c1:=0; c2:=0; count<=0; when others=>null; end case; END IF; END PROCESS c;END second_arc; (3). 仿真结果

34、及其分析仿真结果如下图示:仿真结果分析: 仿真中clk时钟频率为Hz,(实际应用中采用1Hz)。由以上3副截图可以看出:在第一个计数周期内,按第一下key(2us)后,clk上升沿到来时,系统开始计数,并同时输出计数值;第一个运动员到终点(23us)时按第二下key,秒表记住第一个运动员到终点的时间(23us-2us=21us),但还在继续计数并输出计数值;第二个运动员到终点(30us)时按第三下key,停止计数,这时输出的计数值(28)就是第二个运动员用的时间(30us-2us=28us);然后按第四下key,秒表输出第一个运动员到终点的时间(21),即按第二下key时记住的计数值;按第五下

35、key,秒表清0,开始新的周期。此外,由图可见,present_state的变化发生在key=“1”且时钟上升沿来临时。其改变与状态转换图给出的一致。二、自选题 三层电梯控制器1. 实验任务(1) 每层电梯入口处设有上下请求开关,电梯内设有乘客到达层次的停站请求开关。(2) 设有电梯处所处位置指示装置及电梯运行模式(上升或下降)指示装置。(3) 电梯每秒升(降)一层楼(在仿真中取1s)。(4) 电梯到达有停站请求的楼层后,经过1s(在仿真中取1s)电梯门打开,开门指示灯亮,开门4s(在仿真中取2s)后,电梯门关闭(开门指示灯灭),电梯继续运行,直至执行完最后一个请求信号后停在当前层。(5) 能

36、记忆电梯内外的所有请求信号,并按照电梯运行规则次序响应,每个请求信号保留至执行后清除。(6) 电梯运行规则:当电梯处于上升模式时,只响应比电梯所在位置高的上楼请求信号,由下而上逐个执行,直至最后一个上楼请求执行完毕,如更高层有下楼请求,则直接升到下楼请求的最高楼接客,然后便进入下降模式。当电梯处于下降模式时,则与上升模式相反。(7) 电梯初始状态为一层开门。总体框图如下图所示: 2.模块及模块功能 模块veryharrd见下图。将电梯的状态划分为四个:一层状态(c1),二层状态(c2),三层状态(c3),开门状态(kai)。对每一个状态分析其所有的可能。LIBRARY ieee; USE ie

37、ee.std_logic_1164.all;ENTITY veryhardd ISPORT(up1,up2,clk,down2,down3,k1,k2,k3:in std_logic; -up1,up2:是一层、二层的上升要求 -down1,down2:是二层、三层的下降要求 -k1,k2,k3:是在一层、二层、三层停电梯的要求 -up1,up2,clk,down2,down3,k1,k2,k3均与键开关相连 site:out std_logic_vector(3 downto 1); -site:显示电梯现在在哪一层 a1,a2,a3:out std_logic; -a1,a2,a3:显示在

38、哪一层有停电梯要求 mode,door:out std_logic); -door:显示现在门的状态("0"表示关,"1"表示开) -mode:显示电梯现在的运行模式(上升或下降) -a1,a2,a3,door:均与发光二极管相连END veryhardd;ARCHITECTURE veryhardd_arc OF veryhardd IStype state_type is (c1,c2,c3,kai);BEGIN PROCESS (clk) variable upl,downl,tingl,cengl:std_logic_vector(3 downt

39、o 1); variable mo,x,y,z:std_logic; variable cnt1,cnt2:integer; variable state:state_type; BEGIN if clk'event and clk='1' then if up1='0' then upl(1):='1' end if; if up2='0' then upl(2):='1' end if; if down3='0' then downl(3):='1' end if; if

40、 down2='0' then downl(2):='1' end if; if k1='0' then tingl(1):='1' end if; if k2='0' then tingl(2):='1' end if; if k3='0' then tingl(3):='1' end if; if cnt1<10 then -每秒升降一层楼(在仿真中取1s)cnt1:=cnt1+1; else case state is when c1 => ceng

41、l:="001" mo:='0' -电梯在一层转为上升模式 if upl/="000" or downl/="000" or tingl/="000" then z:='1' -任何请求都会破坏初态 end if; if z='0' then -电梯的初态为一层开门状态 door<='1' else door<='0' if tingl(1)='1' or upl(1)='1' then st

42、ate:=kai; -转入开门状态 tingl(1):='0' upl(1):='0' elsif upl(2)='1' or tingl(2)='1' then state:=c2; elsif downl(3)='1' or tingl(3)='1' then state:=c2; x:='1' elsif downl(2)='1' then state:=c2; mo:='1' end if; end if; when c2 => cengl:="010" if mo='0' then if tingl(2)='1' or upl(2)='1' then state:=kai; tingl(2):='0' upl(2):='0' elsif downl(3)='1' or tingl(3)='1' or x='1' then state:=c3; x:='0'

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论