版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
VHDL逻辑电路设计11.1VHDL描述语句11.2组合逻辑电路设计11.3时序逻辑电路设计本章小结思考题与习题
11.1VHDL描述语句
11.1.1顺序语句
1.赋值语句
赋值语句的使用在前面章节中多次出现,如“x<=aANDb;”“y∶=a;”等。顺序赋值语句出现在进程和子程序内部。由于在进程和子程序内部可以声明变量,因此顺序赋值语句包括信号赋值语句和变量赋值语句两类,即在顺序语句结构中允许对信号和变量两种数据对象进行赋值。
2.IF语句
在VHDL语言中,IF语句的作用是根据指定的条件来确定语句的执行顺序。IF语句可用于选择器/比较器、编码器、译码器和状态机等的设计,是VHDL语言中最常用的语句之一。IF语句按其书写格式可分为以下四种。
1)单分支IF语句
单分支IF语句书写格式如下:
IF条件THEN
顺序语句;
ENDIF;
单分支IF语句是一种不完整的条件语句,当程序执行单分支IF语句时,首先对条件表达式的值进行判断,当表达式的值为真时,执行关键字THEN后的顺序语句,直到ENDIF结束;而当条件表达式的值为假时,跳过顺序语句不执行,即保持原理值不变,直接结束IF语句,这意味着要引入存储元件,因此,利用单分支IF语句能够构成时序逻辑电路。
2)双分支IF语句
双分支IF语句是完整条件语句,其语句的书写格式如下:
IF条件THEN
顺序语句1;
ELSE
顺序语句2;
ENDIF;
当条件表达式的值为真时,执行关键字THEN和ELSE之间的顺序语句1;而当条件表达式的值为假时,执行关键字ELSE和ENDIF之间的顺序语句2,即根据IF所指定的条件是否满足,程序可以有两条不同的执行路径。这种结构的条件语句不会出现单分支IF语句不执行任何顺序语句的情况,所以不会产生存储元件,一般用于组合逻辑电路的设计。
3)多分支IF语句
多分支IF语句的书写格式如下:
4)嵌套IF语句
嵌套IF语句的书写格式如下:
IF条件THEN
IF条件THEN
…
ENDIF;ENDIF;
IF语句可以进行多层嵌套。在编写VHDL程序的过程中,IF语句的嵌套可以用来解决具有复杂控制功能的逻辑电路的问题。
3.CASE语句
CASE语句常用来描述总线行为、编码器和译码器的结构。CASE语句可读性好,非常简洁,其一般格式如下:
CASE条件表达式IS
WHEN选择值1=>顺序语句1;
WHEN选择值2=>顺序语句2;
…
WHENOTHERS=>顺序语句n;
ENDCASE;
执行CASE语句时,首先计算条件表达式的值,然后寻找与其相同的选择值,执行对应的顺序语句。如果条件表达式的值与选择值1相等,则执行顺序语句1;如果与选择值2相等,则执行顺序语句2;如果所有选择值与条件表达式的值均不相等,则执行WHENOTHERS分支下的顺序语句n。
通常情况下,CASE语句中的WHEN子句具有5种不同的书写格式,如下所示:
(1)WHEN选择值1=>顺序处理语句;
(2)WHEN选择值1|选择值2|选择值3…|选择值n=>顺序处理语句;
(3)WHEN选择值1TO选择值2=>顺序处理语句;
(4)WHEN选择值1DOWNTO选择值2=>顺序处理语句;
(5)WHENOTHERS=>顺序处理语句;
使用CASE语句时需要特别注意以下几点:
·选择值的取值必须在表达式的取值范围内,且数据类型必须匹配。
·各个选择值只允许出现一次,即不能有相同选择值的条件语句出现。
·如果选择值不能将表达式的值完全列举,最后必须加上WHENOTHERS子句,代表以上所列所有选择值中未能列出的其他可能取值。
·WHENOTHERS子句只能出现一次,且只能作为最后一种条件选择值。
·符号“=>”不是操作符,它的含义相当于“THEN”(或“于是”)。
4.LOOP语句
LOOP语句的功能是循环执行一条或多条语句。它主要有三种基本形式:FOR/LOOP、WHILE/LOOP以及条件跳出形式。
1)FOR/LOOP语句
FOR/LOOP语句的格式如下:
[标号:]FOR循环变量IN循环次数范围LOOP
顺序语句;
ENDLOOP[标号];
2)WHILE/LOOP语句
VHDL中的条件循环是通过WHILE/LOOP语句实现的,它的一般格式如下:
[标号:]WHILE循环条件LOOP
顺序语句;
ENDLOOP[标号];
在该LOOP语句中,如果循环条件为真,则进行循环;如果条件为假,则跳出循环。需要注意的是,WHILE/LOOP语句循环条件中的变量需要事先进行显式声明。
3)条件跳出语句
前面讲述的FOR/LOOP和WHILE/LOOP循环语句是通过循环次数或循环条件来限定执行循环次数的。当需要人为跳出本次循环或整个循环语句,转去执行下一次循环或循环语句之外的其他操作语句时,可以采用NEXT语句(跳出本次循环)和EXIT语句(跳出整个循环)。
(1)NEXT语句。NEXT语句在LOOP语句执行中进行无条件的或有条件的转向控制,其格式如下:
NEXT[LOOP标号][WHEN条件表达式];
其中,LOOP标号及WHEN子句都是可选项,因此,可以将NEXT语句具体分为以下4种形式:
·NEXT;
·NEXTLOOP标号;
·NEXTWHEN条件表达式;
·NEXTLOOP标号WHEN条件表达式;
(2)EXIT语句。在LOOP语句中,使用EXIT语句可跳出并结束整个循环(注意:不是当次循环),继续执行LOOP语句后的其他顺序语句。EXIT语句的语法格式如下:
EXIT[LOOP标号][WHEN条件表达式];
可以看到,EXIT语句的格式与NEXT语句的格式一致,通过是否选用可选项,如“LOOP标号”“WHEN条件表达式”等也可以分为4种形式,与NEXT语句类似,这里不再赘述。
5.WAIT语句
在进程(或过程)中,WAIT语句具有和敏感信号参数一致的作用,可以用来触发进程(或过程)。值得注意的是,如果一个进程中包含了WAIT语句,就不能再使用敏感信号了,否则综合时会出现错误。
WAIT语句有4种不同的形式,分别是:
·WAITON信号1[,信号2,…];--等待敏感信号变化
·WAITUNTIL条件表达式;--等待表达式为真
·WAITFOR时间;--等待固定的时间
·WAIT;无限等待
(1)WAITON语句。WAITON语句的语法结构如下:
WAITON信号1[,信号2,…];
WAITON语句后面跟着的是一个或多个信号量。当进程PROCESS中的顺序描述语句执行到WAITON语句时将会挂起,直到敏感信号中的任一信号发生变化,进程才结束挂起状态,继续执行WAITON语句后的语句。
(2)WAITUNTIL语句。WAITUNTIL语句的语法结构如下:
WAITUNTIL条件表达式;
WAITUNTIL语句后跟的是布尔表达式,当进程执行到该语句时将被挂起,直到表达式返回一个“真”值,进程才被再次启动。
该语句在表达式中将建立一个隐式的敏感信号量表,当表中任何一个信号量发生变化时,表达式的结果会被重新计算,如果计算结果为“真”,则进程继续执行后续语句;如果计算结果为“假”,则保持挂起状态。
(3)WAITFOR。WAITFOR语句表示等待固定的时间,它的语法结构如下:
WAITFOR时间表达式;
时间表达式的含义是,表达式的运算结果为一个时间值。如果时间表达式是一个常量,则WAITFOR语句将等待固定的时间;如果时间表达式是一个计算式,那么计算的结果应该是一个时间值,进程执行到WAITFOR语句时将挂起,等待时间表达式所指示的时间长度,然后继续执行后续语句。
(4)WAIT。单独使用WAIT语句,表示当代码执行到此处时,将一直处于等待状态。
上述语句等待的是以下3个条件:
·信号量nmi和interrupt中任何一个有一次新的变化;
·信号量nmi或interrput中任何一个取值为“真”;
·该语句已等待5ns。
实际上,上述4种形式的WAIT语句中,WAITON、WAITFOR和WAIT语句是不可综合的。WAITUNTIL语句只有在条件表达式为时钟的边沿时,如WAITUNTILclock='1'时,是可综合的,否则也是不可综合的。
6.NULL语句
在VHDL语法中,NULL语句用来表示一种只占位置的空操作,即它不执行任何操作,唯一的功能是使逻辑运行流程进入下一步语句的执行。NULL语句经常用在CASE语句中,表示除了列出的选择值所对应的操作行为外,其他未列出的选择值所对应的空操作行为,从而能够满足CASE语句列举表达式所有可能取值的要求。
需要指出的是,很多情况下在CASE语句中使用NULL语句并不是最佳的选择,有时反而会引入不必要的锁存器模块,需要设计者仔细考虑。
11.1.2并行描述语句
由于硬件描述语言所描述的实际系统的许多操作是并行的,所以在对系统进行仿真时,这些系统中的元件在定义的仿真时刻应该是并行工作的。并行描述可以是结构性的,也可以是并行性的。并行语句就是用来表示这种并行行为的语句,在并行语句中最关键的语句是进程。在VHDL中能进行并行处理的语句有进程语句、并行信号赋值语句、元件例化语句、条件信号赋值语句、选择信号赋值语句、块语句和生成语句。
1.进程语句
进程(PROCESS)语句在前面已多次提到,并在众多实例中得到了广泛的使用。进程语句是一种并行处理语句,在一个结构体中多个进程语句可以同时并行运行,因此,进程语句是VHDL中描述硬件系统并发行为的最基本语句。
在一个结构体内可以有一个或多个进程,不同进程的地位是相同的,进程间的执行是并行的、独立的,由各自敏感信号的变化触发。一个进程有两个状态:等待状态和执行状态。在等待状态下,当任一敏感信号发生变化时,进程立即启动进入执行状态。当进程顺序执行到ENDPROCESS语句时,重新进入等待状态,等待下一次敏感信号的改变。进程语句内部结构由一系列顺序语句构成,能够很好地体现VHDL语言的行为描述能力。
敏感信号量表包含了进程中所有的输入信号。由于进程语句的执行依赖于敏感信号的变化,即当某一敏感信号发生改变,如从“1”跳变到“0”时就将启动进程语句,于是进程内部的顺序语句就被执行一遍,然后返回进程的起始端,进入等待状态,直到下一次敏感信号量表中的敏感信号再次发生变化。进程说明部分用于定义进程所需的局部数据环境,通常是数据类型、常数、子程序、变量等,它们将在顺序描述语句中被使用,在进程说明部分不允许定义信号和全程变量。以关键词BEGIN引导开始的顺序语句是一段顺序执行的语句,如IF语句、CASE语句、LOOP语句等。顺序语句只在进程和函数、过程结构中使用。
VHDL中的进程有两种类型:组合进程和时序进程。组合进程用于设计组合逻辑电路,时序进程用于设计引入了触发器的时序逻辑电路。
在组合进程中,所有输入信号必须都包含在敏感信号量表中,包括赋值符号“<=”右边的所有信号以及IF语句、CASE语句中判断表达式的所有信号。如果有一个信号没有包含在敏感信号量表中,则当这个信号变化时,该进程不会被激活,输出信号也不会得到新的赋值。
时序进程又可分为同步和异步两类。同步进程只对时钟信号敏感,即仅在时钟的边沿启动;异步进程除了对时钟信号敏感外,还对影响异步行为的输入信号敏感,即该输入信号的变化也能启动进程。例11.1.4显示了一个带有异步复位信号reset的D触发器。当信号reset取值为1时,输出q立即被复位为0,而不管此时是否有时钟信号clk的上升沿到来,即信号reset的变化也能够启动进程。当信号reset值为0时,如果有时钟信号的上升沿到来,则输出q被赋值为d。
进程语句归纳起来具有如下几个特点:
·它可以与其他进程并行运行,并可存取结构体或实体名中所定义的信号;
·进程结构中的所有语句都是按顺序执行的;
·为启动进程,进程结构中必须包含一个显式的敏感信号量表或者一个WAIT语句;
·进程之间的通信是通过信号传递来实现的;
·后面提到的一些并行语句实质上是一种进程的缩写形式,仍可以归属于进程语句。
2.并行信号赋值语句
赋值语句(信号赋值语句)可以在进程内部使用,此时它以顺序语句形式出现;赋值语句(并行信号赋值语句)也可以在结构体的进程之外使用,此时它以并行语句形式出现。每一条并行信号赋值语句都相当于一条缩写的进程语句。
3.元件例化语句
元件例化就是将预先设计好的设计实体定义为一个元件,然后利用特定的语句将此元件与当前设计实体中指定的端口连接,从而为当前设计实体引入一个新的低一级的设计层次。元件例化可以是多层次的,即在当前设计实体中调用的元件本身也是一个低层次的设计实体,它也可以通过调用其他的元件来实现。元件可以是一个已经设计好的设计实体(采用VHDL或Verilog语言设计的实体),也可以是来自FPGA元件库中的元件,或是LPM模块、IP核等。
元件例化语句一般由两部分组成:元件声明和元件例化。
(1)元件声明。元件声明把一个现成的设计实体定义为一个元件,即封装,只留出对外的接口界面。元件声明语句的功能是对待调用的元件作出调用声明,其一般语句格式如下:
COMPONENT元件名
[GENERIC(类属表);]
PORT(端口名表);
ENDCOMPONENT元件名;
元件声明以关键词COMPONENT开始,元件名是待调用底层设计实体的实体名。类属表部分不是必需的,当有需要传递的类属参量时才需要。端口名表需要列出该元件对外通信的各端口名,与实体中的PORT语句一致,所以,对需要调用的元件,将对应的VHDL代码的实体描述部分直接复制过来即可,但务必将关键词由ENTITY改为COMPONENT。元件声明必须放在关键词ARCHITECTURE和BEGIN之间,即结构体说明语句部分。
(2)元件例化。元件例化语句是底层元件与当前设计实体的连接说明,其一般语句格式如下:
例化名:元件名PORTMAP([端口名=>]连接端口名,
[端口名=>]连接端口名,…)
端口间的映射关系有两种方式:名称映射和位置映射。
①名称映射是指利用对应的接口名称进行连接,就是将元件的各端口名称赋予顶层系统中的信号名称,即端口名与连接端口名的映射。名称映射的优点是端口的顺序可以任意变化。例11.1.5使用VHDL语言的名称映射实现了4选1多路选择器。
例11.1.5确定了顶层文件实体名mux41,在实体描述部分定义了顶层的输入、输出端口。结构体部分首先在说明语句处定义了信号x1和x2,用于器件内部的连接线;利用关键词COMPONENT声明了底层待调用元件mux2_l。结构体功能描述语句部分利用端口映射语句PORTMAP将三个mux2_1元件连接起来构成了4选l多路选择器。其电路结构如图11.1.1所示。图11.1.14选1选择器电路结构
②位置映射是指在PORTMAP语句中不写出端口名和连接符号“=>”,仅指定连接端口名,但连接端口名的书写顺序必须与元件端口说明中信号的书写顺序一一对应。例11.1.6将显示采用位置映射方式实现的4选1多路选择器的元件例化。
4.条件信号赋值语句
条件信号赋值语句也是并行描述语句,它可以根据不同条件将不同的多个表达式之一的值代入信号量,其书写格式如下:
目标信号量<=表达式1WHEN条件1ELSE
表达式2WHEN条件2ELSE
表达式3WHEN条件3ELSE
…
表达式n;
WHEN/ELSE语句使用中要注意以下几点:
(1)“WHEN条件ELSE”称为条件子句,条件子句后不需要加分号(或逗号)。
(2)条件的判别是按照书写的顺序逐项进行测定的,一旦发现条件为TRUE,即将对应表达式的值赋予目标信号量。也就是说,执行赋值的表达式是第一个满足布尔条件为真时所对应的表达式。
(3)当所有条件都不满足时,执行最后一条表达式的赋值。最后一条表达式没有条件子句,需要加分号,代表WHEN/ELSE语句结束。
(4)条件中允许使用不同的信号,这使得WHEN/ELSE语句在设计时非常灵活。
通过前面的介绍不难看出,IF语句和条件信号赋值语句具有一定的相似之处,它们都可以根据对条件的判断结果来决定对信号的赋值操作。但是它们之间还是存在着明显区别的,主要体现在以下几个方面:
(1)IF语句是顺序描述语句,而条件信号赋值语句是并行描述语句。
(2)IF语句中的ELSE子句是可选项,而条件信号赋值语句中必须含有ELSE子句。
(3)IF语句可以进行嵌套,而条件信号赋值语句不能进行嵌套。
(4)IF语句一般用于描述硬件电路的高层次描述,它对设计人员的硬件知识要求不高;而条件信号赋值语句与实际的硬件电路十分接近,因此它对设计人员的硬件知识要求很高。
(5)通常情况下,设计人员很少使用条件信号赋值语句,只有当采用进程语句、IF语句或者CASE语句难以描述硬件电路的逻辑功能时,设计人员才会采用条件信号赋值语句。
5.选择信号赋值语句
选择信号赋值语句类似于CASE语句,它对表达式进行测试,当条件表达式满足不同的条件时,选择相应的表达式对目标信号进行赋值。选择信号赋值语句的书写格式如下:
WITH/SELECT/WHEN语句使用中要注意以下几点:
(1)关键词WITH后的条件表达式是选择信号赋值语句的敏感量。每当条件表达式的值发生变化时,就将启动语句对各子句的条件值进行对比,当发现有满足条件的子句时,就将此子句中表达式的值赋给目标信号。
(2)各条件的值需要覆盖条件表达式的所有可能取值,如果不能将其覆盖,最后必须加上WHENOTHERS子句。
(3)选择信号赋值语句对子句条件值的对比具有同期性,不像条件信号赋值语句那样按照书写顺序从上至下逐条测试,因此,选择信号赋值语句中的条件值不能出现重复的情况。
(4)与条件信号赋值语句相比,选择信号赋值语句只允许有一个条件表达式,而条件信号赋值语句允许在条件中使用不同的信号。
(5)特别注意,选择信号赋值语句的每一子句用逗号分隔,最后一条子句结尾用分号表示结束;而条件信号赋值语句每一子句的结尾没有任何标点,只有最后一条子句的结尾用分号表示结束。
6.块语句
块语句(BLOCK语句)是并行语句,其内部所包含的语句也是并行语句。块语句可以将结构体中的并行语句进行分割和组合,有利于管理较长的代码和提高可读性。块语句有两种基本形式:简单块语句和保护块语句。
(1)简单块语句。简单块语句的格式如下:
标号:BLOCK
[块声明部分;]
BEGIN
并行语句;
ENDBLOCK[标号];
标号是设计者自定义的标识符,是块的名称。在关键词BLOCK前的标号是必需的,而在ENDBLOCK后的标号可以省略。块声明部分可以声明块的局部对象,包括数据类型、常量、信号和子程序等,块声明部分也不是必需的。
块语句(不管是简单块语句还是保护块语句)能够嵌套在另一个块语句中。例11.1.8显示了三个嵌套的块语句b1、b2和b3,其中块b2嵌套在块b1中,块b3嵌套在块b2中。块中声明的对象对这个块以及嵌套在其中的所有块都是可见的,且当子块声明的对象与父块声明的对象具有相同的名称时,子块将忽略父块的声明。
(2)保护块语句。保护块语句是块语句中的特殊形式,它的基本格式如下:
标号:BLOCK(保护表达式)
[块声明部分;]
BEGIN
并行语句;
ENDBLOCK[标号];
保护块语句相比于简单块语句在关键词BLOCK后增加了一个特殊的表达式,称为保护表达式。保护表达式用于确定是否执行块中的保护语句,当保护表达式取值为真(TRUE)时,执行保护块内的保护语句;反之,则不执行。例11.1.9是一个带了同步复位信号reset的D触发器。当时钟上升沿到来时,保护表达式为真,则可以执行保护块内的保护语句。如果此时复位信号reset取值为1,则q被赋值0。
7.生成语句
生成语句(GENERATE语句)与LOOP语句类似,可以实现某一段代码的重复多次执行,这意味着生成语句有一种复制作用,能够产生多个完全相同的元件。生成语句有FOR/GENERATE和IF/GENERATE两种使用形式。
(1)FOR/GENERATE语句。FOR/GENERATE语句的格式如下:
需要注意的是,关键词FOR前的标号是设计者自行定义的标识符,它是必需的。循环变量是自动由生成语句声明的,不需要事先声明,它仅是一个局部变量,根据取值范围自动递增或递减。取值范围必须是一个可计算的整数范围,它的语句格式有两种形式,分别是:
表达式TO表达式;--递增方式
表达式DOWNTO表达式;--递减方式
(2)IF/GENERATE语句。IF/GENERATE语句的格式如下:
IF/GENERATE语句仅在条件表达式为真时才执行结构体内部的并行语句,即条件表达式的结果是布尔型的。IF/GENERATE语句与顺序语句IF不同的是,IF/GENERATE语句中没有ELSE或ELSIF分支语句。
11.2组合逻辑电路设计
组合逻辑电路是一种不含存储元件的电路,其输出完全由输入决定。常见的组合逻辑电路包括三态门电路、编码器、译码器、多路选择器和全加器等。
11.2.1三态门电路和双向端口
三态门是驱动电路常用的器件,其输出除了高、低电平两种状态外,还有第三种状态———高阻态。处于高阻态时,其输出相当于断开状态,没有任何逻辑控制功能。三态门输出逻辑状态的控制是通过一个输入控制端en来实现的。当en为高电平时,三态门呈现正常的逻辑0和逻辑1的输出;当en为低电平时,三态门输出呈现高阻状态,即断开状态,相当于该逻辑门与它相连接的电路处于断开状态。三态门主要用于总线的连接,通常在总线上接有多个器件,每个器件通过控制端进行选通,当器件没有被选中时,它就处于高阻状态,相当于没有接在总线上,不影响其他器件的工作。
于该逻辑门与它相连接的电路处于断开状态。三态门主要用于总线的连接,通常在总线上接有多个器件,每个器件通过控制端进行选通,当器件没有被选中时,它就处于高阻状态,相当于没有接在总线上,不影响其他器件的工作。图11.2.1三态门总线传输
11.2.2编码器和译码器
在数字电路中,需要建立特定信息与二进制码间的联系。如果用若干位二进制码代表特定意义的信息,就称为编码,即输入为特定信息,输出为相应的二进制码。常见的编码方式有8421BCD编码、8线3线编码、8线3线优先编码、10线4线优先编码等。如果需要编码的信息量是N,则需要m位二进制码,m和N满足N<2m。编码的逆过程就是译码,即将输入的二进制码还原成事先规定的、具有特殊意义的输出信号。
例11.2.3是一个8线3线优先编码器的示例,它将8位输入信号转换成3位二进制编码,其功能见表11.2.1。可以看到,当输入端i(7)取值为1时,即使其他输入端i(6)~i(0)取值为1也将会被忽略,i(7)具有最高的优先级,输出编码为“111”。当输入端i(7)取值为0时,才会判断i(6)的取值。如果此时i(6)取值为1,则输出编码为“110”;否则继续判断i(5)的取值。8位输入端具有优先级,这就是“优先”二字的由来。
例11.2.4是使用CASE语句实现的译码器,其功能如表11.2.2所示。
11.2.3串行进位加法器
加法器是电路设计中常用的基本器件,以全加器为基础,可以设计出任意位数的串行进位加法器。例11.2.5是采用LOOP语句实现的8位串行进位加法器,可以通过改变类属参量的值来改变串行进位加法器的位数。
11.2.4计算矢量中0的个数的电路
例11.2.6的VHDL程序用来计算信号data中0的个数,该例使用了LOOP语句和NEXT语句。NEXT语句表示当某一位是1时,跳出本次循环,继续判断下一位。
11.3时序逻辑电路设计
时序逻辑电路与组合逻辑电路最大的区别是:时序逻辑电路的输出不仅和输入有关,还与电路当前的状态有关,即时序逻辑电路具有记忆功能。时序逻辑电路的主要特征是时钟信号的驱动,即电路的各个状态在时钟的节拍下变化。本节以几个典型时序逻辑电路为例进一步说明VHDL语句的使用。
11.3.1JK触发器
JK触发器是数字电路中常用的一种触发器,是构成时序逻辑电路的基础器件,它的逻辑功能如表11.3.1所示。当时钟信号clk的下降沿到来时,判断j和k的取值。当j=k=0时,触发器处于保持状态,即保持当前输出不变;当j=0,k=1时,触发器处于置0状态;当j=1,k=0时,触发器处于置1状态;当j=1,k=1时,触发器处于翻转状态,即下一个状态总是与前一个状态取值相反。
例11.3.1是采用VHDL语言描述的JK触发器。当时钟信号clk的下降沿到来时,根据j和k的不同取值决定输出的状态。
11.3.2移位寄存器
例11.3.2是采用CASE语句实现的移位模式可控的移位寄存器。当控制信号ctl取值为“00”时,实现左移,最低位移入数据cin;当控制信号ctl取值为“01”时,实现右移,最高位移入数据cin;当控制信号ctl取值为“10”时,实现循环左移;当控制信号ctl取值为“11”时,实现循环右移。
11.3.3数字分频器
分频器是时序逻辑电路中广泛应用的电路,其基本功能是把频率较高的时钟信号按照要求分频成频率较低的时钟信号。分频的基本参数有分频系数和占空比。假设原信号频率是20kHz,分频后信号频率为5kHz,则分频系数是4。占空比指在一个周期内高电平所占时间的比率,如方波的占空比是50%。
例11.3.3是一个分频器的示例。该例声明了一个计数信号cnt1和一个计数变量cnt2,可根据它们计数的次数分别控制输出信号f1和f2的分频系数。在实体描述部分声明了类属参量n1和n2,它们的默认值均是3,其中参量n1是计数信号cnt1的计数终值,参量n2是计数变量cnt2的计数终值。实体描述部分同时还声明了类属参量len,作为cnt1和cnt2的取值范围的最大值。通过改变类属参量n1、n2和len的取值就可以改变分频系数。
以输出信号f1为例,当clk上升沿到来时,计数信号cnt1从0开始计数。当计数到n1时,输出取反,同时计数信号cnt1清零。在下一次时钟信号clk上升沿到来时,再次重新从0开始计数,不断重复上述过程。这意味着每计数n1+1次(计数范围0~n1),输出信号f1就会发生一次翻转,即输出信号f1的频率是clk频率的1/[2(n1+1)]。由于本例中n1的默认取值为3,所以f1的频率是clk频率的1/8,且占空比是50%。由于计数变量cnt2是变量,所以每次计数是从0到2,而非0到3,输出信号f2的频率是clk频率的1/6。请读者自行分析产生差异的原因。如果要使输出信号f2的频率也是clk频率的1/8,那么n2应该取值多少?
例11.3.3虽然可以实现任意分频,但其占空比总是50%。例11.3.4对例11.3.3稍作修改,即可以实现任意分频和占空比的分频器设计,其分频系数是10,占空比是70%。可以看出,n1和n2的取值决定了分频系数和占空比,如果想让占空比为30%,则只需要将n2的取值改变为2即可。
11.3.4两位十进制计数器
计数器是数字电路中使用频繁的器件,它除了可以进行精确的数字计数外,还可以产生分频信号、控制有限状态机的转换、作为存储器的地址发生器等。总之,计数器是所有实用电路系统中不可缺少的器件。
例11.3.5是一个两位十进制计数器的示例,它可以从0计数到99。其中,cnt1代表个位计数结果,cnt2代表十位计数结果。
例11.3.5两位十进制计数器示例。
在实际系统中,经常需要使用数码管进行显示。数码管是常用的显示器件,一般由发光二极管作为笔段,分为共阴和共阳两种。共阴数码管的八段发光二极管的阴极连接在一起,阳极对应各段分别控制,如输入端a输入高电平就点亮该段;共阳数码管的八段发光二极管的阳极连接在一起,阴极对应各段分别控制,如输入端a输入低电平就点亮该段,因此通过控制各段的电平就可以点亮数码管的各段,从而显示不同的数字。以共阳数码管为例,公共端接地,具体各段编码如表11.3.2所示,其中dp代表小数点。
例11.3.5需要两位数码管分别显示计数结果的个位和十位,即在计数电路的基础上需要增加显示模块,用于控制数码管的显示,其连接示意如图11.3.1所示。其中dig0和dig1作为位选信号分别连接在数码管1和数码管2的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- T/SXJP 066-2023冷鲜猪肉
- T/SZBX 106-2022农家乐餐饮服务规范
- T/EPIAJL 3-2019 T/LEPA 1-2019超期服役火电机组寿命评估技术细则
- T/CI 1259-2025填料硫酸钙 (MR硫酸钙)
- T/CAAM 0004-2025频谱热疗房
- T/COEMA 25-2026激光安全员岗位规范
- 2025~2026学年河南省安阳市滑县人教版六年级上册12月月考数学试卷【附答案】
- 2025~2026学年安徽合肥市庐江县苏教版第二册四年级数册末质量检测试卷(A卷)【附答案】
- 2025-2026学年湖北省宜都市初中历史九年级期末下册通关重点试题(附答案)
- 2025-2026学年四川省攀枝花市初中历史九年级期末下册自我评估黑金试卷(附答案)
- 2026“外研社·国才杯”“理解当代中国”外语能力国际传播综合能力赛项真题及答案解析(10月11日上午场次)
- 2026年七年级数学竞赛试题及答案
- 河南2027届高三年级过程性作业评价(青桐鸣)联考数学+答案
- 九年级上册英语完形填空100篇(含答案解析)
- 2026全国《安全生产法及重大事故隐患判定》竞赛知识考试题库与答案
- 教育评价学教学课件
- 建筑工程竣工验收报告贵州版
- 邮轮餐饮服务双语实训指导-西餐宴会服务常见问题
- 学堂在线 批判性思维-方法和实践 章节测试答案
- 村级水管员业务知识培训课件
- 文明丧葬规则解读
评论
0/150
提交评论