




免费预览已结束,剩余38页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章 VHDL语言实践 学习VHDL语言实际练习很重要,下面是5个实际例子,每个例子都在本书附录2中介绍的实验板上验证,并证明是正确的。6.1 实践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表示灯亮。从该状态机的特点可以看出,这是一个梅里状态机,这是因为只要按钮一按下,一些动作就立刻开始执行,而不是等到状态转移后,例如当按钮按下,两秒定时器就开始工作。实验步骤:在单独的文件夹中建立项目、输入各个底层VHDL源文件、仿真;建立顶层电路图源文件,将各个底层描述形成模块符号、连接电路、锁定引脚、编译、下载到实验板、观察结果。图6.1-1 楼梯灯控制装置框图 图6.1-2 楼梯灯的状态图(1)状态机的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 clkevent and clk=1 then zt_now 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 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 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 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 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 if key=0 then lamp=0;st240=0;st2=0;zt_next=s1; else lamp=0;st240=0;st2=0;zt_next if key=1 then lamp=1;st240=0;st2=1;zt_next=s8; else lamp=1;st240=0;st2=0;zt_next 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 if key=0 then lamp=0;st240=0;st2=0;zt_next=s1; else lamp=0;st240=0;st2=0;zt_nextzt_next=s1; end case;end process;end fsm_arch;240s时间到灭灯2s时间到进s3按键第1次按下按键连续按下2次,进入长亮状态s6按键按下1次,进入定时状态s3按键按下时间超过2s,进入s5灭灯按键按下超过2s,进入状态s8灭灯该状态机的仿真结果如图6.1-2所示。图6.1-2状态机仿真图(2)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 clkevent 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秒减计数器的仿真结果如图6.1-3所示。图6.1-2 2秒减计数器的仿真结果(3)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 clkevent 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 bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb 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; 该译码器是十六进制七段译码,用于共阳极数码管,仿真结果如图6.1-5所示。图6.1-5 译码器仿真结果(5)分频电路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 clkevent 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;该分频器是十六分频计数器,仿真结果如图6.1-6所示。(7)顶层模块图顶层模块如图6.1-7所示。仿真结果如图6.1-8图6.1-7 楼道灯顶层模块图按钮按下,灯亮,30秒后灯灭按钮按下,用按下时间延长2s的方式灭灯按钮按下2次,灯常亮,用按下时间延长2s的方式灭灯图6.1-8 楼道灯顶层模块仿真结果图6.2-1密码锁原理框图6.2实践2: 用VHDL语言描述密码锁 设计一个数字密码锁,该密码锁在输入正确的4位十进制顺序数字后才能输出有效信号开锁,因此,该锁有一个可以输入十进制数据的键盘。该密码锁的4位十进制密码使用DIP开关或是拨码盘设置。在锁门时,需要按下复位信号。该数字密码锁可以在楼宇保安系统中使用。用小规模数字集成电路实现该锁的总体电路图如图6.2-1所示。 该数字密码锁由键盘、数据寄存器、比较器、密码电路、存储比较状态的D触发器、移位寄存器等部件组成,这些部件在状态机的指挥下统一工作。 该数字密码锁的工作原理是:,在系统复位后,密码电路准备好第一个密码。当键盘输入第一个按键,状态机S1信号上升沿将键盘输入数据存入键盘数据寄存器,同时从密码电路取出第一位密码放在密码寄存器中,比较器输出比较结果,S1信号的下降沿将第二位密码准备好;当状态机的S2信号上升沿到达后,根据比较器输出的比较结果,D触发器动作,当键盘输入数字与密码相同时,比较器输出1,D触发器置1,若是键盘输入数字与密码不同,比较器输出0,D触发器置0;如果D触发器输出1,则在S3信号上升沿,移位寄存器移位操作,如果连续四次键盘信号都与密码相同,则移位寄存器移位4次,正好把置入的1移位到串出端,输出继电器发出开锁动作。如果D触发器输出0,则移位寄存器置数操作,将11110000置入,所以串出端输出0,输出继电器不动作,与此同时,将状态机和密码电路复位,就是说,只要密码一输入错误,以前输入的密码就无效了,必须重新输入。下面介绍使用VHDL语言设计该密码锁。 (1)状态机设计 根据密码输入、比较的需要,应该有一个状态机,负责输入数据、密码的锁存、密码比较以及移位寄存器的动作。该状态机的输入信号是键盘每一个按键的按下动作信号x,就是说每一个密码输入,都会启动状态机,完成一系列动作。状态机的输出是控制密码选择器、密码锁存和输入数据锁存和比较的s1信号,控制密码比较后输出s2信号和控制移位寄存器的s3信号。状态图如图6.2-2所示。 图6.2-2 状态机的状态图状态机的VHDL描述如下: library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity mima10kgai isport( x,clk :in std_logic; -x是按键按下信号 s3,s2,s1 :out std_logic; -状态机输出信号 sel :out std_logic_vector(1 downto 0); -调试状态机的信号end;architecture mima10k_arch of mima10kgai istype zt_type is (z0,z1,z2,z3);ATTRIBUTE ENUM_ENCODING : STRING;attribute enum_encoding of zt_type :type is 00 01 11 10; -定义格雷编码signal zt_now, zt_next : zt_type;beginn1:process(clk) begin if clkevent and clk=1 then zt_now s1=0;s2=0;s3=0; sel=00; if x=1 then zt_next=z1; else zt_next s1=1;s2=0;s3=0; sel=01; zt_next s1=0;s2=1;s3=0;sel=10;zt_next s1=0;s2=0;s3=1;sel=11; if x=0 then zt_next=z0; else zt_nextzt_next sc=0000;cc sc=0001;cc sc=0010;cc sc=0011;cc sc=0100;cc sc=0101;cc sc=0110;cc sc=0111;cc sc=1000;cc sc=1001;cc sc=0000;cc=0; end case; end process;end bianma_arch;图6.2-4 编码电路的仿真结果(3)密码设置密码设置电路在s1信号的作用下顺序输出密码,同时在rst信号作用下复位,在复位状态,输出信号shuchu等于第1个密码。library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity mimaset isport( s1 ,rst:in std_logic; -s1的上升沿使计数器计数,不同的计数值选择不同的密码 -rst是复位计数器的信号 shuchu :out std_logic_vector(3 downto 0); -密码输出end;architecture mimaset_arch of mimaset issignal qq:std_logic_vector(1 downto 0);beginn1: process(s1,rst) 计数器进程 begin if rst=0 then qq=00; elsif s1event and s1=0 then qq shuchu shuchu shuchu shuchushuchu =0000; end case; end process;end mimaset_arch; 该模块的仿真结果如图6.2-5所示。 图6.2-5 密码设置模块的仿真结果(4)锁存与比较 锁存比较电路用于输入密码和已设置密码的比较。在s1信号的作用下,对输入信号shuru和已设置密码信号mima进行比较,在s2信号上升沿,输出比较结果信号dpp。该模块的仿真结果如图6.2-6所示。library ieee;use ieee.std_logic_1164.all;entity suocun isport( s1, s2 :in std_logic; shuru,mima :in std_logic_vector(3 downto 0); dpp :out std_logic);end;architecture suocun_arch of suocun issignal so_shuru,so_mima : std_logic_vector(3 downto 0);signal bijiao :std_logic;begin process(s1) 比较进程 begin if s1event and s1=1 then so_shuru= shuru; so_mima = mima ; end if; if so_shuru=so_mima then bijiao=1; else bijiao=0; end if; end process; process(s2)输出数据进程 begin if s2event and s2=1 then dpp=bijiao; end if; end process;end suocun_arch;图6.2-6 比较模块的仿真结果(5)移位寄存器library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity mimayw isport( s3 ,load,rst :in std_logic; y :out std_logic);end;architecture mimasyw_arch of mimayw issignal qq:std_logic_vector(7 downto 0); beginn1: process(s3,load) 在load信号对移位寄存器并行置数,s3信号的上升沿移位操作。 begin if (load=0) or (rst=0) then qq=00001111; elsif s3event and s3=1 then qq(7 downto 1)=qq(6 downto 0); end if; y bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb = 1111111;end case; abc=bb;end process;end mimayima_arch; (7) 密码锁顶层模块密码锁顶层模块如图6.2-8所示。仿真结果如图6.2-9所示。有仿真结果可知,当输入密码5612时,输出呈现低电平,表示开锁,输入其他数字,输出呈现高电平,表示不开锁。 图4 密码锁的顶层电路图6.2-9 密码锁顶层模块的仿真结果6.3 实践3: 用VHDL实现电子秒表 一秒表使用一个按键工作,当第一次按下按键时,秒表开始计数,第二次按下按键时,秒表停止计数,第三次按下按键时,秒表计数器继续计数,第四次按下时,秒表计数器停止计数,如此反复。若是在停止计数状态,按键按下时间超出2s,则秒表计数器清零。要求最小显示时间是10ms,最大显示时间是99分钟。采用2MHz的石英晶体振荡器。 该秒表框图如图6.3-1所示。根据实际描述,有图6.3-2所示的状态图。图6.3-1秒表框图图6.3-2 状态图 (1)状态机模块 状态机接受时钟信号clk、按键信号x,2秒定时到信号;输出2秒定时器启动信号two_ds、计数控制信号jishu和复位信号reset。状态机的仿真结果如图6.3-3所示。library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity state isport( x,clk,two_dsd :in std_logic; reset,jishu,two_ds :out std_logic);end;architecture state_arch of state istype zt_type is (z0,z1,z2,z3,z4,z5,z6);ATTRIBUTE ENUM_ENCODING : STRING;attribute enum_encoding of zt_type :type is 000 001 011 010 110 111 101; -格雷编码signal zt_now, zt_next : zt_type;beginn1:process(clk) -状态寄存进程 begin if clkevent and clk=1 then zt_nowif x=1 then reset=1;jishu=1;two_ds=0; zt_next=z1; else reset=0;jishu=0;two_ds=0; zt_nextif x=0 then reset=1;jishu=1;two_ds=0; zt_next=z2; else reset=1;jishu=1;two_ds=0; zt_nextif x=1 then reset=1;jishu=0;two_ds=0; zt_next=z3; else reset=1;jishu=1;two_ds=0; zt_nextif x=0 then reset=1;jishu=0;two_ds=0; zt_next=z4; else reset=1;jishu=0;two_ds=0; zt_nextif x=1 then reset=1;jishu=1;two_ds=1; zt_next=z5; else reset=1;jishu=0;two_ds=0; zt_nextif x=0 then reset=1;jishu=1;two_ds=0; zt_next=z2; elsif two_dsd=1 then reset=0;jishu=0;two_ds=1; zt_next=z6; else reset=1;jishu=1;two_ds=1; zt_nextif x=0 then reset=0;jishu=0;two_ds=1; zt_next=z0; else reset=0;jishu=0;two_ds=1; zt_next reset=0;jishu=0;two_ds=0; zt_next=z0; end case; end process;end state_arch;图6.3-3 状态机的仿真结果(2)2秒定时器模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity ds2 isport(clk,two_ds :in std_logic; two_dsd :out std_logic; sh :out std_logic_vector(3 downto 0);end;architecture ds2_arch of ds2 issignal qq: std_logic_vector(3 downto 0);begin process(clk,two_ds) begin if two_ds=0 then qq=0010; elsif clkevent and clk=1 then if qq/=0000 then qq=qq-1; else qq=qq; end if; end if; end process; two_dsd=1 when qq=0000 else 0; sh=qq;end ds2_arch;(3)10分频模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity fenpin10 isport(clk,rst,jishu :in std_logic; co :out std_logic; sh :out std_logic_vector(3 downto 0);end;architecture fenpin10_arch of fenpin10 issignal qq: std_logic_vector(3 downto 0);begin process(clk,rst) begin if rst=0 then qq=0000; elsif clkevent and clk=1 then if jishu=1 then if (qq1001) then qq=qq+1; else qq0); end
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年祁阳市市直机关遴选考试真题
- 中华传统文化实践教育知到智慧树答案
- 中文文献资料检索知到智慧树答案
- 中西文化对比知到智慧树答案
- 2025标识标牌定制化产品研发与市场推广合同
- 2025年二手车深度检查与维修合同协议书
- 2025代销协议书-健康养生产品区域分销合同
- 2025版新型建材涂料粉刷施工合作协议书
- 2025年度新型防盗窗安装及保养服务合同范本
- 2025版农业科技园租赁合同
- 出差国外安全协议书
- 人教版九年级英语unit-1教案电子教案
- 中学历史教师课程思政研修计划
- 2025年法宣试题及答案
- 2025年公租房入住合同范例
- 征兵业务培训
- Unit 6 Useful numbers Part C Project(说课稿)-2024-2025学年人教PEP版(2024)英语三年级上册
- 危险废物处置服务协议
- 《观光农业概论》课件
- 派出所签订治安调解协议书范文
- 情境领导力培训课件
评论
0/150
提交评论