版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
EDA项目教程
——基于VHDL与FPGA主编:于润伟本章要点
VHDL语言的顺序语句
键盘输入程序设计
数码显示计数器的设计与实现项目4
计数器的设计与实现
计数器的逻辑功能就是记忆时钟脉冲的个数,是数字系统中常用的一种具有记忆功能的电路,可用来实现系统中的计数、分频和定时等功能。4.1十进制计数器的设计4.1.1进程语句一个结构体内可以包含多个进程语句,多个进程之间是同时执行的。进程语句本身是并行语句,但每个进程的内部则由一系列顺序语句构成。进程语句的格式如下:[进程名]:PROCESS(敏感信号表)[IS]进程说明;--说明用于该进程的常数,变量和子程序
BEGIN
变量和信号赋值语句;顺序语句;ENDPROCESS[进程名];(1)进程名:表示该进程的名称,可以缺省。(2)敏感信号:列出触发启动本进程的全部信号名,通常所有的输入端口都可以列入。当任意一个敏感信号的值发生变化时,立即启动进程语句,进程中的顺序语句按书写顺序循环执行,直到敏感信号值稳定不变为止。(3)说明部分:可以缺省。定义该进程所需的局部数据环境,包括常量、变量和子程序等,但不能定义信号,信号只能在结构体的说明部分定义。(4)顺序语句组:通常包含变量赋值语句、信号赋值语句、IF语句、CASE语句等顺序语句。进程语句的主要特点归纳如下:(1)同一结构体中的各个进程之间是并发执行的,并且都可以使用实体说明和结构体中所定义的信号、常量和变量;但同一进程中的顺序语句组则是按照书写顺序执行的顺序语句。(2)为启动进程,进程的结构中必须至少包含一个敏感信号。敏感信号通常是时钟脉冲、输入端口等。但一个进程中不允许出现两个时钟信号。(3)结构体中的各个进程之间,可以通过结构体中定义的信号或变量来进行通信,但在进程说明部分定义的变量,只能在该进程内部使用。(4)VHDL中所有并行语句都可以理解为特殊的进程,只是不以PROCESS结构出现,其逻辑表达式中的信号就是隐含的敏感信号。4.1.2IF语句(1)跳转控制。格式如下:
IF条件THEN
顺序语句;
ENDIF;当程序执行到IF语句时,先判断IF语句指定的条件是否成立。如果成立,IF语句所包含的顺序处理语句将被执行;如果条件不成立,程序跳过IF语句包含的顺序语句,而执行ENDIF语句后面的语句,这里的条件起到决定是否跳转的作用。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYdffcISPORT(clk,d:INSTD_LOGIC;qout:OUTSTD_LOGIC);ENDdffc;用IF语句描述一个上升沿触发的基本D触发器ARCHITECTUREoneOFdffcISBEGINPROCESS(CLK)BEGINIF(CLK'EVENTANDCLK='1')THEN--判断时钟脉冲上升沿qout<=d;ENDIF;ENDPROCESS;ENDone;从仿真波形中可以看出,在0~100ns区间,CLK在50ns处出现上升沿,D=0,输出Q=0;在100ns~200ns区间,CLK在150ns处出现上升沿,D=1,输出Q=1;在200ns~300ns区间,CLK在250ns处出现上升沿,D=0,输出Q=0。其他区间的波形情况符合时钟上升沿触发的基本D触发器。时钟上升沿触发的基本D触发器仿真波形(2)二选一控制。格式如下:IF条件THEN顺序语句;ELSE顺序语句;ENDIF;根据IF所指定的条件是否成立,程序可以选择两种不同的执行路径,当条件成立时,程序执行THEN和ELSE之间的顺序语句部分,再执行ENDIF之后的语句;当IF语句的条件不成立时,程序执行ELSE和ENDIF之间的顺序语句,再执行ENDIF之后的语句。设a和b为选择电路的输入信号,sel为选择控制信号,output为输出信号。ENTITYselection2ISPORT(a,b,sel:INBIT;output:OUTBIT);ENDselection2;用IF语句描述一个“二选一”电路ARCHITECTUREdataOFselection2ISBEGINPROCESS(a,b,sel)BEGINIF(sel='1')THEN--控制信号sel为1
则输出aoutput<=a;ELSEoutput<=b;ENDIF;ENDPROCESS;ENDdata;(3)多选择控制语句。格式如下:IF条件1THEN顺序语句1;
ELSIF条件2THEN顺序语句2;
……;
ELSIF条件nTHEN顺序语句n;
ELSE顺序语句n+1;ENDIF;多选择控制的IF语句,可允许在一个语句中出现多重条件,实际上是条件的嵌套。当满足所给定的多个条件之一时,就执行该条件后的顺序语句;当所有的条件都不满足时,则执行ELSE和ENDIF之间的语句。注意:每个IF语句必须有一个对应的ENDIF语句。设输入信号为a0~a3,sel为选择信号,y为输出信号。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYselection4ISPORT(a:INSTD_LOGIC_VECTOR(3DOWNTO0);sel:INSTD_LOGIC_VECTOR(1DOWNTO0);y:OUTSTD_LOGIC);ENDselection4;用IF语句描述一个“四选一”电路ARCHITECTUREoneOFselection4ISBEGINPROCESS(a,sel)--进程中任何一个信号出现变化,将导致进程执行一次BEGINIF(sel="00")THENy<=a(0);ELSIF(sel="01")THENy<=a(1);ELSIF(sel="10")THENy<=a(2);ELSEy<=a(3);ENDIF;ENDPROCESS;ENDone;从仿真波形中可以看出,SEL=00时,输出Y=A(0);SEL=01时,输出Y=A(1);SEL=10时,输出A(2);SEL=11时,Y=A(3)。用IF语句描述“4选1”数据选择器的仿真波形1.二进制递增计数器
设计一个4位二进制递增计数器,没有控制端,系统通电就开始计数,实现单一递增计数的功能。
定义一个临时变量,使用IF语句判断时钟脉冲的上升沿,在每个时钟脉冲的上升沿到来时,临时变量就加1,最后将临时变量值赋值给输出信号。
由于结构体中,进行了加法运算,使用了“+”号,需要调用STD_LOGIC_UNSIGNED程序包。设CLK为时钟输入端、Q为计数输出端,临时变量名为qtemp。4.1.3二进制计数器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYbcountISPORT(CLK:INSTD_LOGIC;Q:OUTSTD_LOGIC_VECTOR(3DOWNTO0));ENDbcount;参考程序:ARCHITECTUREaOFbcountISBEGINProcess(CLK)VARIABLEqtemp:STD_LOGIC_VECTOR(3DOWNTO0);BEGINIFCLK'EVENTANDCLK='1'THENqtemp:=qtemp+1;ENDIF;Q<=qtemp;ENDPROCESS;ENDa;二进制递增计数器仿真波形
从仿真波形中可以看出,在时钟脉冲的上升沿,输出Q按二进制递增,当计数到1111时,下一个脉冲上升沿回到0000。
想一想、做一做:将VARIABLE(变量)改成SIGNAL(信号)是否可行?为什么?
设计一个3位二进制同步清零可逆计数器,能实现递增计数、递减计数和同步清零功能。
时序逻辑电路的清零方式有同步和异步两种。同步清零是指清零信号有效时,还要等待时钟脉冲的有效沿到来,计数器才回到零状态。
异步清零则不用等待时钟有效沿的到来,只要清零信号有效,计数器就会清零。
可逆计数器就是增加一个计数方向控制端,用来控制是递增计数还是递减计数。2.二进制可逆计数器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYscountISPORT(CLK:INSTD_LOGIC;CLR:INSTD_LOGIC;D:INSTD_LOGIC;Q:OUTSTD_LOGIC_VECTOR(2DOWNTO0));ENDscount;
设CLK为时钟输入端、D为计数方式控制端(高电平为递增计数、低电平为递减计数)、CLR为清零控制端和Q为计数输出端。参考程序如下。
ARCHITECTUREaOFscountISSIGNALQTMP:STD_LOGIC_VECTOR(2DOWNTO0);BEGINProcess(CLK)BEGINIFCLK'EVENTANDCLK='1'THENIFCLR='0'THENQTMP<="000";ELSIFD='1'THENQTMP<=QTMP+1;ELSEQTMP<=QTMP-1;ENDIF;ENDIF;Q<=QTMP;ENDPROCESS;ENDa;3位二进制同步清零可逆计数器仿真波形
从仿真波形中可以看出,在0~100ns区间,CLR=0(清零有效),输出Q=000;在100~500ns区间,CLR=1(清零无效)、D=1(递增计数),输出Q按二进制递增,计数到111时,下个脉冲上升沿回到000;在500ns~600ns区间,CLR=1(清零无效)、D=0(递减计数),输出Q按二进制递减;在600ns~700ns区间,CLR=0(清零有效),由于同步清零要等待时钟脉冲的有效沿,所以输出Q在625ns后清零,并保持到725ns。
想一想、做一做:删除或注释掉USEIEEE.STD_LOGIC_UNSIGNED.ALL;存盘后编译,看看显示什么错误?1.题目要求
利用QuartusⅡ软件的文本输入方式,设计一个4位异步清零、同步置数、同步使能的十进制可逆计数器,完成编译和波形仿真后,下载到实验平台验证电路功能。2.电路设计
置数是设置计数初始值,使能是允许计数器工作。设CLR为异步清零端(低电平有效)、CE为计数使能端(高电平有效)、LOAD为同步置数端(高电平有效)、DIR为计数方向端(1表示递增计数、0表示递减计数)、DIN为置数数据输入端、Q为计数器输出端。4.1.4十进制可逆计数器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYSPCOUNTISPORT(clk:INSTD_LOGIC;reset:INSTD_LOGIC;ce,load,dir:INSTD_LOGIC;din:INSTD_LOGIC_VECTOR(3DOWNTO0); Q:BUFFERSTD_LOGIC_VECTOR(3DOWNTO0));ENDSPCOUNT;ARCHITECTUREAOFSPCOUNTISBEGINPROCESS(clk,reset)VARIABLEcounter:STD_LOGIC_VECTOR(3DOWNTO0);BEGINIFreset='0'THENcounter:="0000";--reset高电平有效ELSIFclk'EVENTANDclk='1'THENIFload='1'THENcounter:=din;ELSEIFce='1'THENIFdir='1'THENIFcounter="1111"THENcounter:="0000";ELSEcounter:=counter+1;ENDIF;ELSEIFcounter="0000"THENcounter:="1111";ELSEcounter:=counter-1;ENDIF;ENDIF;ENDIF;ENDIF;ENDIF;Q<=counter;ENDPROCESS;ENDA;
从仿真波形中可以看出,在0~40ns区间,CLR=0(异步清零有效),输出Q=0000;40~80ns区间,CLR=1(异步清零无效)、LOAD=1(同步置数有效)、DIN=5(置数数据),输出Q=0101(十进制的5),与DIN相同;在80~360ns区间,CLR=1(异步清零无效)、LOAD=0(同步置数无效)、CE=1(计数使能有效)、DIR=1(递增计数),输出Q按十进制递增计数;在360~480ns区间,CLR=1(异步清零无效)、LOAD=0(同步置数无效)、CE=0(计数使能无效),输出Q=0010保持不变。同样分析其他区间。异步清零同步置数可逆计数器仿真波形;
按键是最常见的人机交互接口部件。电子产品所需要的键盘按键个数非常有限,通常为几个到十几个不等,需要单独设计成专用的小键盘,常用的有编码键盘、扫描键盘和虚拟键盘等。
数码管是数字系统常用的显示器件,键盘输入的数码管显示器就是将键盘输入的数码显示在数码管上。4.2编码键盘的设计4.2.1CASE语句CASE表达式ISWHEN条件选择值1=>顺序语句1;WHEN条件选择值2=>顺序语句2;WHEN条件选择值3=>顺序语句3;……;WHENOTHERS=>顺序语句n;ENDCASE;其中WHEN的条件选择值有以下几种形式:(1)单个数值,如WHEN3。(2)并列数值,如WHEN1|2,表示取值1或者2。(3)数值选择范围,如WHEN(1TO3),表示取值为1、2、或者3。(4)其他取值情况,如WHENOTHERS,常出现在ENDCASE之前,代表已给出的各条件选择值中未能列出的其他可能取值。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmux41ISPORT(S1,S0:INSTD_LOGIC;A,B,C,D:INSTD_LOGIC;Y:OUTSTD_LOGIC);ENDmux41;用CASE语句描述“4选1”数据选择器ARCHITECTUREoneOFmux41ISSIGNALS:STD_LOGIC_VECTOR(1DOWNTO0);BEGINPROCESS(S1,S0,A,B,C,D)BEGINS<=S1&S0;CASESISWHEN"00"=>Y<=A;WHEN"01"=>Y<=B;WHEN"10"=>Y<=C;WHEN"11"=>Y<=D;WHENOTHERS=>Y<='Z';ENDCASE;ENDPROCESS;ENDone;用CASE语句描述“4选1”数据选择器波形
从仿真波形中可以看出,在0~100ns区间,S0=0、S1=0,即S=00,输出Q=A;在100ns~200ns区间,S0=1、S1=0,即A=01,输出Q=B;在200ns~300ns区间,S0=0、S1=1,即A=10,输出Q=C;在300ns~400ns区间,S0=1、S1=1,即A=11,输出Q=D。其他区间的波形情况符合“4选1”数据选择器。4.2.2数码管的静态显示数字系统常用的显示器件有发光二极管、数码管、液晶显示器等,其中最常用的是数码管。数码管分别由A、B、C、D、E、F、G位段和表示小数点的DP位段组成。内部是由8个LED发光二极管组成的,控制每个LED的点亮或熄灭实现数字显示。数码管分为共阳极和共阴极两种接法,把数码管内所有二极管的阳极连接到一起的称为共阳极接法;把所有二极管的阴极连接到一起称为共阴极接法。4.2.2数码管的静态显示静态显示就是将需要显示的BCD码数据经过译码后,分别接到数码管的驱动端,每4位BCD码连接一个数码管。静态显示的优点是结构简单、显示稳定,缺点是数码较多时,会占用大量的I/O接口线。4位BCD译码器的输入端有4个,共有24=16种不同的输入组合,每一种组合可对应一个数码,而十进制数码共有10个,因此会出现6个无效状态,这时数码管的显示应该为暗。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYSDISPISPORT(D:INSTD_LOGIC_VECTOR(3DOWNTO0);S:OUTSTD_LOGIC_VECTOR(6DOWNTO0));ENDSDISP;
ARCHITECTUREAOFSDISPISBEGINPROCESS(D)BEGINCASEDISWHEN"0000"=>S<="1111110";--0WHEN"0001"=>S<="0110000";--1WHEN"0010"=>S<="1101101";--2WHEN"0011"=>S<="1111001";--3WHEN"0100"=>S<="0110011";--4WHEN"0101"=>S<="1011011";--5WHEN"0110"=>S<="1011111";--6WHEN"0111"=>S<="1110000";--7WHEN"1000"=>S<="1111111";--8WHEN"1001"=>S<="1111011";--9WHENOTHERS=>S<="0000000";ENDCASE;ENDPROCESS;ENDA;波形仿真4.2.3编码键盘在数字电路中,可以利用编码器实现按键键值的直接编码。
将每个按键的输出信号对应连接到编码器的每个输入端,通过编码逻辑就可以在编码器的输出端得到对应每个按键的码值,称这种键盘为编码键盘。但是当按键较多时,编码键盘会由于按键和连线较多,造成成本高;另外直接编码的方法也不够灵括,一旦编码逻辑固定就难以更改了。1.设计题目设计一个12-4线的编码键盘,按键为弹起式,已经过“去抖动”处理。参考程序:12-4线的编码键盘应该有1个时钟脉冲输入端、1个十二位的按键输入端和1个四位的按键输出端。设时钟脉冲输入端为CLK、按键输入端为KEYIN、按键输出端为KEYOUT。实体名为ENCODEJP。LIBRARYIEEE;--调用IEEE库USEIEEE.STD_LOGIC_1164.ALL;--打开程序包ENTITYENCODEJPISPORT(CLK:INSTD_LOGIC;KEYIN:INSTD_LOGIC_VECTOR(11DOWNTO0);KEYOUT:OUTSTD_LOGIC_VECTOR(3DOWNTO0));ENDENTITYENCODEJP;
ARCHITECTUREARTOFENCODEJPISSIGNALN:STD_LOGIC_VECTOR(3DOWNTO0);SIGNALZ:STD_LOGIC_VECTOR(11DOWNTO0);BEGINPROCESS(CLK,KEYIN)BEGINZ<=KEYIN;IFCLK'EVENTANDCLK='1'THENCASEZISWHEN"000000000001"=>N<="0000";--0WHEN"000000000010"=>N<="0001";--1WHEN"000000000100"=>N<="0010";--2WHEN"000000001000"=>N<="0011";--3WHEN"000000010000"=>N<="0100";--4WHEN"000000100000"=>N<="0101";--5WHEN"000001000000"=>N<="0110";--6WHEN"000010000000"=>N<="0111";--7WHEN"000100000000"=>N<="1000";--8WHEN"001000000000"=>N<="1001";--9WHEN"010000000000"=>N<="1010";--*WHEN"100000000000"=>N<="1011";--#WHENOTHERS=>N<="1111";ENDCASE;ENDIF;ENDPROCESS;KEYOUT<=N;ENDARCHITECTUREART;编码键盘仿真波形从仿真波形中可以看出,在0~100ns区间,输入KEYIN=111111111110(按下0键),输出KEYOUT=0000(键0的编码);在100ns~200ns区间,输入KEYIN=111111111101(按下1键),输出KEYOUT=0001(键1的编码)。其他波形区间情况符合设计要求。想一想、做一做:如果将12-4线编码键盘改为8-3线,如何修改程序?
虚拟键盘需要一个由系统内部时钟信号产生的周期性变化的编码信号,还需要一个输入信号确认键。
当看到显示的数字是要向系统输入的数码时,按下输入信号确认键,编码信号就不再变化,将当前显示的数码输入到系统;
然后抬起输入信号确认键,编码信号再次周期性变化。
虚拟键盘不需要外接键盘电路,对输入信息的编码灵活方便,常用于调试硬件系统。4.2.4数码显示的虚拟键盘1.题目要求
设计一个能够输入十进制数码0~9的虚拟键盘,输入的数码显示在共阴极的数码管上。2.电路设计
根据题意要求,可分为虚拟键盘和数码管静态显示2个部分,虚拟键盘应该有1个时钟脉冲输入端、1个数码确认键和1个十进制数值的显示输出端;1个数码管采用静态显示方式,其输入信号就是十进制数值的显示输出端。设CLK为时钟脉冲输入端、SET为数码确认键、定义临时信号temp为十进制数值的显示输出端、临时信号cnt作为从0到9周期性变化的计数值;当按下数码确认键SET时,将cnt的当前值赋值给temp,再经过数码管译码后静态显示。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYxnjpISPORT(CLK:INSTD_LOGIC;SET:INSTD_LOGIC;--输入数码确认键
高电平有效S:OUTSTD_LOGIC_VECTOR(6DOWNTO0));ENDxnjp;ARCHITECTUREARTOFxnjpISSIGNALcnt,temp:STD_LOGIC_VECTOR(3DOWNTO0);BEGINP0:PROCESS(CLK)BEGINIFCLK'EVENTANDCLK='1'THENIFcnt="1001"THEN--0~9周期性变化的信号cnt<="0000";ELSEcnt<=cnt+1;ENDIF;ENDIF;ENDPROCESSP0;P1:PROCESS(cnt,SET)BEGINIFSET='1'THENCASEcntISWHEN"0000"=>temp<="0000";WHEN"0001"=>temp<="0001";WHEN"0010"=>temp<="0010";WHEN"0011"=>temp<="0011";WHEN"0100"=>temp<="0100";WHEN"0101"=>temp<="0101";WHEN"0110"=>temp<="0110";WHEN"0111"=>temp<="0111";WHEN"1000"=>temp<="1000";WHEN"1001"=>temp<="1001";WHENOTHERS=>temp<="1111";ENDCASE;ENDIF;ENDPROCESSP1;P2:PROCESS(temp)BEGINCASEtempISWHEN"0000"=>S<="1111110";--0WHEN"0001"=>S<="0110000";--1WHEN"0010"=>S<="1101101";--2WHEN"0011"=>S<="1111001";--3WHEN"0100"=>S<="0110011";--4WHEN"0101"=>S<="1011011";--5WHEN"0110"=>S<="1011111";--6WHEN"0111"=>S<="1110000";--7WHEN"1000"=>S<="1111111";--8WHEN"1001"=>S<="1111011";--9WHENOTHERS=>S<="0000000";ENDCASE;ENDPROCESSP2;ENDART;虚拟键盘的仿真波形从仿真波形中可以看出,信号cnt在时钟上升沿按十进制规律递增计数,在SET为高电平时,将信号cnt的当前值赋值给temp,再将temp译码显示在数码管上;SET为低电平,temp保持原值,显示的数码不再变化。想一想、做一做:该程序能否将进程P1和进程P2合并成一个?4.3.1数码管的动态显示3位一体数码管是将3个单个数码管的驱动端(A、B、C、D、E、F、G和DP)连接到一起形成公用数据总线,再把3个COM(公共端)引出,作为选通端。同样分为共阴极和共阳极两种。动态扫描原理
由于驱动端接在一起,3位一体数码管采用动态显示方式。动态显示是将所有显示数据的BCD码按照一定的顺序和变化频率送到公用数据总线上,再通过一个共用的显示译码器译码后,接到数码管的驱动端,同时利用一个与数据总线变化频率相同的选通信号来确定是那个数码管显示。即选通信号决定是那一个数码管显示,该时刻公用数据总线上的数据决定这个数码管显示的内容。在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人眼的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。
设CLK为系统时钟脉冲(1KHz左右,频率太低会闪烁,频率太高会暗)、A、B、C为显示数据、COM为数码管的选通信号、SEG为数码管的显示驱动信号,实体名为ddisp。结构体中需要1个周期性变化的信号(00~10),可以用计数器实现,设为cnt,用CASE语句描述选通过程和显示译码。参考程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYddispISPORT(CLK:INSTD_LOGIC;A:INSTD_LOGIC_VECTOR(3DOWNTO0);B:INSTD_LOGIC_VECTOR(3DOWNTO0);C:INSTD_LOGIC_VECTOR(3DOWNTO0);--A、B、C为显示数据COM:OUTSTD_LOGIC_VECTOR(2DOWNTO0);--数码管的选通信号SEG:OUTSTD_LOGIC_VECTOR(6DOWNTO0));--数码管的显示驱动信号ENDENTITYddisp;3.结构体的确定
结构体中需要1个周期性变化的信号(从00~11),可以用计数器实现,设为CNT;选通信号设为COM,用CASE语句描述选通过程;再有1个数码管共阴接法的静态显示器即可。ARCHITECTUREARTOFDDISPISSIGNALCNT:STD_LOGIC_VECTOR(1DOWNTO0);SIGNALBCD:STD_LOGIC_VECTOR(3DOWNTO0);BEGINPROCESS(CLK)BEGINIFCLK'EVENTANDCLK='1'THEN--周期性变化的信号CNTIFCNT="11"THENCNT<="00";ELSECNT<=CNT+'1';ENDIF;ENDIF;ENDPROCESS;PROCESS(CNT)BEGINCASECNTISWHEN"00"=>BCD<=A;COM<="1110";--COM选通信号低电平有效WHEN"01"=>BCD<=B;COM<="1101";WHEN"10"=>BCD<=C;COM<="1011";WHEN"11"=>BCD<=D;COM<="0111";WHENOTHERS=>BCD<="0000";COM<="1111";ENDCASE;CASEBCDIS--译码器WHEN"0000"=>SEG<="1111110";--0WHEN"0001"=>SEG<="0110000";--1WHEN"0010"=>SEG<="1101101";--2WHEN"0011"=>SEG<="1111001";--3WHEN"0100"=>SEG<="0110011";--4WHEN"0101"=>SEG<="1011011";--5WHEN"0110"=>SEG<="1011111";--6WHEN"0111"=>SEG<="1110000";--7WHEN"1000"=>SEG<="1111111";--8WHEN"1001"=>SEG<="1111011";--9WHENOTHERS=>SEG<="0000000";ENDCASE;ENDPROCESS;ENDART;波形仿真4.3.2扫描键盘扫描键盘也称为矩阵式键盘,将按键连接成矩阵,每个按键就是一个位于水平扫描线和垂直译码线交点上的开关,再通过一个键盘输入译码电路,将键盘扫描线和垂直输出译码线信号的不同组合编码转化成一个特定的信号值或编码。扫描键盘的优点是当需要的按键数量较多时,可以节省I/O口线,只需要M条行线和N条列线就可以组成M×N个按键的扫描键盘;缺点是编程相对复杂。1.设计题目设计一个4×3扫描键盘,按键为弹起式,已经过“去抖动”处理。4×3扫描键盘电路
扫描信号通过行线KY3~KY0进入键盘,按照1110→1101→1011→0111→1110的顺序周期性变化,每次扫描一行(低电平有效,相当于该行接地)。假设现在的扫描信号为1011,代表正在扫描4、5、6这行的按键,如果这行当中没有按键被按下的话,则列线KX2~KX0的输出为111(高电平);如果有按键被按下,该键位输出0(低电平),其余键位输出1(高电平)。例如当扫描信号为1011(KY2=0)时,若列线输出011(KX2=0),则键4被按下、若输出110则键6被按下;当扫描信号为1101(KY1=0)时,列线输出101(KX2=0),则键8被按下。4×3扫描键盘应该有1个时钟脉冲输入端、1个3位的按键列信号输入端(接KX0~KX2);1个4位的扫描信号输出端(接KY0~KY3)、1个3位的按键编码输出端。设时钟脉冲输入端为CLK、按键列信号输入端KEYIN、扫描信号输出端为SCAN、数字按键输出端为DATAOUT、功能按键输出端FUNOUT。实体名为SCANJP。参考程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYscanjpISPORT(CLK:INSTD_LOGIC;KEYIN:INSTD_LOGIC_VECTOR(2DOWNTO0);--按键列信号输入端SCAN:OUTSTD_LOGIC_VECTOR(3DOWNTO0);--扫描信号输出端DATAOUT:OUTSTD_LOGIC_VECTOR(3DOWNTO0);--数字按键输出端FUNOUT:OUTSTD_LOGIC_VECTOR(3DOWNTO0));--功能按键输出端ENDENTITYscanjp;ARCHITECTUREARTOFscanjpISSIGNALcnt:STD_LOGIC_VECTOR(1DOWNTO0);SIGNALD,F:STD_LOGIC_VECTOR(3DOWNTO0);--键值寄存器SIGNALZ:STD_LOGIC_VECTOR(4DOWNTO0);--键盘信息寄存器BEGINPROCESS(CLK)--产生扫描信号cntBEGINIFCLK'EVENTANDCLK='1'THENIFcnt="11"THENcnt<="00";ELSEcnt<=cnt+'1';ENDIF;ENDIF;ENDPROCESS;SCAN<="1110"WHENcnt="00"ELSE--条件信号赋值语句"1101"WHENcnt="01"ELSE"1011"WHENcnt="10"ELSE"0111"WHENcnt="11"ELSE"1111";Z<=cnt&KEYIN;--连接扫描信号和列信号PROCESS(CLK,cnt,KEYIN)BEGINIFCLK'EVENTANDCLK='1'THENCASEZIS--按键编码WHEN"00101"=>D<="0000";--0WHEN"11011"=>D<="0001";--1WHEN"11101"=>D<="0010";--2WHEN"11110"=>D<="0011";--3WHEN"10011"=>D<="0100";--4WHEN"10101"=>D<="0101";--5WHEN"10110"=>D<="0110";--6WHEN"01011"=>D<="0111";--7WHE
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《医学伦理学》课程教学大纲2
- 2024年伐木工承包伐木合同范本
- 2024年出售化工贮罐合同范本
- 2024年传菜电梯维修合同范本
- 中风后康复护理查房
- 医院药学部培训课件
- 健康教育及分级护理指导
- 2024广告字制作合同
- 医疗机构廉洁从业
- 2024技术委托开发合同详细范本
- 管理哲学导论(第3版) 课件 第六章 组织的结构与行为
- 解决方案部规章制度
- 河海大学开题报告
- 电梯安全质量管理体系建立
- 大学美育 第2版 课件 第四章 形式美与美育
- 医疗机构高警示药品风险管理规范(2023版)
- Wow English S4-S6单词可直接打印
- 国家开放大学《财政与金融(农)》形考任务1-4参考答案
- 大象版科学三年级下《控制电路》
- 环保设备运行管理台账
- 城镇土地估价规程
评论
0/150
提交评论