EDA技术及应用 课件 第5单元 常用模块电路的Verilog HDL 设计_第1页
EDA技术及应用 课件 第5单元 常用模块电路的Verilog HDL 设计_第2页
EDA技术及应用 课件 第5单元 常用模块电路的Verilog HDL 设计_第3页
EDA技术及应用 课件 第5单元 常用模块电路的Verilog HDL 设计_第4页
EDA技术及应用 课件 第5单元 常用模块电路的Verilog HDL 设计_第5页
已阅读5页,还剩78页未读 继续免费阅读

下载本文档

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

文档简介

EDA技术及应用高等职业教育本科精品教材PART01单元1EDA概述PART02单元2VerilogHDL结构与要素PART03单元3VerilogHDL描述语句PART05单元5常用模块电路的VerilogHDL设计PART06单元6基础设计PART07单元7IP核的应用目录CONTENTSPART04单元4QuartusPrime设计基础PART08单元8综合设计PART05单元5常用模块电路的VerilogHDL设计5.1

Verilog语言模块描述方式5.2组合逻辑电路设计5.3时序逻辑电路设计5.4状态机的设计5.1Verilog语言模块描述方式5.1Verilog语言模块描述方式在Verilog语言中,有3种主要的模块描述方式,分别是门级描述、数据流描述和行为描述。5.1.1门级描述门级描述作为一种较为底层的模块描述手段,基于基本逻辑门来构建电路。这种方式直接运用Verilog内置的门级原语and(与门)、or(或门)、not(非门)等对电路的结构进行描述,其与硬件电路的实际物理结构最为贴近,能够清晰地展现电路是由哪些具体的逻辑门构成的,以及它们之间是如何连接的。门级描述方式适合描述相对简单的组合逻辑电路,通过直接罗列逻辑门原语以及它们之间的连接关系,呈现电路的功能实现过程。门级描述方式示例如例5.1所示。【例5.1】使用门级描述方式实现二输入与门电路。5.1Verilog语言模块描述方式例5.1中首先定义了一个名为and_gate的模块,它有两个输入端口a和b,以及一个输出端口y,明确了该模块与外部进行信号交互的接口。语句andu1(y,a,b)则是整个门级描述的核心部分,其中and是Verilog内置的表示与门的门级原语,u1是该与门的实例名,其作用是在当前模块中对这个具体的与门实例进行唯一标识,方便在后续的设计、调试以及综合等过程中对其进行区分和引用。这样的语句清晰地表明了将输入端口a和b作为与门的输入,而输出端口y则接收与门的输出结果,完整且直观地构建了一个简单的二输入与门电路结构。虽然门级描述在体现电路实际结构方面具有优势,但随着电路复杂程度的提升,单纯依靠门级描述来构建整个电路会使代码变得冗长且难以维护,因为每一个逻辑门都需要单独进行实例化和连接描述,所以在面对较为复杂的电路设计时,往往需要结合更高级别的描述方式来提高设计效率和代码的可读性。5.1Verilog语言模块描述方式5.1.2数据流描述数据流描述方式从抽象级别上又可分为两种:RTL(寄存器传输)描述、结构级描述。1.RTL描述RTL描述是一种抽象程度较高的描述方式,不涉及具体的硬件结构,而是侧重于描述数据的处理流程和时序关系。以规定设计中的各种寄存器形式为特征,在寄存器之间插入组合逻辑。它描述了数据流的运动路径、运动方向和运动结果。RTL描述方式类似于布尔方程,可以描述时序电路,也可以描述组合电路。它既含有逻辑单元的结构信息,又隐含某种行为,是非结构化的并行描述。在实际应用中,RTL描述常用于描述数字电路中的控制器、数据通路等较为复杂且对数据处理和时序要求较高的部分。【例5.2】4位加法器的RTL描述。5.1Verilog语言模块描述方式5.1Verilog语言模块描述方式在这个4位加法器的模块定义中,有两个4位宽度的输入端口a和b,用于接收要相加的两个数据,还有一个时钟输入端口clk,以及一个4位宽度的输出端口sum,用于输出相加的结果。核心的逻辑部分在always块内,当检测到时钟clk的上升沿时,就会执行sum<=a+b语句,将输入的a和b的值相加后赋给sum寄存器。这样的描述方式清晰地展示了数据在时钟驱动下,从输入端口经过加法运算这一组合逻辑处理后,流向输出端口的整个流程,体现了RTL描述在描述数据处理和时序配合方面的特点,同时也说明了它如何在不涉及过多硬件底层实现细节的情况下,有效地实现一个具有实际功能的数字电路模块。2.结构级描述结构级描述同样是基于基本的逻辑门、模块实例化等方式来构建电路。但它与门级描述有所不同,它更侧重于直接描述电路的硬件结构,就如同将实际的电路连接图用代码的形式呈现一样,通过实例化已有的模块并按照特定的连接方式将它们组合在一起,能够构建不同复杂程度的电路。【例5.3】异或门模块的Verilog描述。5.1Verilog语言模块描述方式5.1Verilog语言模块描述方式【例5.4】结构级描述示例。5.1Verilog语言模块描述方式例5.3中设计了一个异或门模块,模块名为myxor,综合的逻辑电路如图51所示。例5.4中采用结构级描述的方式,调用例化元件异或门myxor,综合的逻辑电路如图52所示。5.1Verilog语言模块描述方式结构级描述方式在设计可复用的模块以及构建大型、复杂的数字电路系统时非常实用,它能够将复杂的电路分解为多个相对简单且功能明确的子模块,然后通过合理的实例化和连接来实现整体的功能,提高了代码的复用性和电路设计的可维护性,同时也方便不同设计人员进行协作开发,各自负责不同的子模块,最后通过结构级描述进行整合。5.1Verilog语言模块描述方式5.1.3行为描述在Verilog硬件描述语言中,行为描述方式关注电路的功能和行为,就像描述一个“黑盒子”的工作方式,只强调输入和输出之间的关系,而不关心内部硬件结构是如何实现的。【例5.5】8位计数器的Verilog行为描述。5.1Verilog语言模块描述方式例5.5的8位计数器的模块定义了输入端口clk(时钟信号)和clr(清零信号),以及输出端口out(8位的计数值输出)。核心的行为逻辑通过always块体现,当检测到时钟clk的上升沿时,会进行条件判断,如果clr信号为高电平,也就是清零信号有效时,输出信号out就会被赋值为0,实现计数器的清零操作;而当clr信号为低电平,即清零信号无效时,输出信号out的值就会在原有的基础上加1,实现计数功能。行为描述方式定义了一个计数器的基本行为逻辑,描述电路的功能,而不需要详细说明是如何连接来实现这些功能的。这种描述方式在设计复杂的时序逻辑电路或者需要快速验证电路功能的场景中非常有用,它能够让设计人员快速搭建起一个功能模型,然后通过仿真等手段来验证其功能是否符合预期,之后再根据实际需求进一步细化。5.2组合逻辑电路设计5.2组合逻辑电路设计5.2.1编码器编码器作为一种常见且实用的组合逻辑电路,主要功能是将多个输入信号编码成一个二进制代码,从而实现对输入信息的压缩表示,便于在数字系统中进行传输、处理和存储等操作。根据其处理多个输入同时有效的方式不同,可分为普通编码器和优先编码器两种类型。1.普通编码器普通编码器要求在任何时刻只有一个输入信号有效,如果同时有多个输入有效,输出不确定。42普通编码器功能见表51。5.2组合逻辑电路设计在Verilog中,可以使用case语句来描述42普通编码器,如例5.6所示。【例5.6】case语句描述42普通编码器。5.2组合逻辑电路设计部的输入信号,输出端口out则是2位宽度的寄存器类型信号,用于输出编码后的二进制代码。在always块内,使用case语句来根据输入in的不同取值进行相应的输出赋值操作。当in的值为4'b0001时,只有最低位输入有效,此时输出out被赋值为2'b00。同理,对于其他几种有效的输入情况,都会按照功能表的定义进行相应的输出赋值。default分支则是考虑到当输入不符合功能表中定义的有效情况时,比如多个输入同时为1,则将输出设置为不确定值2'bxx,以此体现普通编码器在不符合输入规则时输出的不确定性。42普通编码器的仿真波形如图53所示。5.2组合逻辑电路设计2.优先编码器优先编码器相较于普通编码器,在处理多个输入信号同时有效这一情况时有着明显的不同。它能够根据预先设定的优先级顺序,对优先级最高的输入信号进行编码,而自动忽略优先级较低的同时有效的输入信号。42优先编码器功能见表52。5.2组合逻辑电路设计【例5.7】if-else语句描述42优先编码器。5.2组合逻辑电路设计在这个模块定义中,输入端口in同样是4位宽度的wire类型信号,输出端口out为2位宽度的寄存器类型信号。在always块内,首先判断最高位in[3]是否为1,如果是,不管其他低位输入的情况如何,都按照最高优先级的规则将输出out赋值为2'b11;若in[3]不为1,则接着判断次高位in[2],以此类推,按照从高到低的优先级顺序依次判断输入位,直到确定对应的输出编码值。42优先编码器的仿真波形如图54所示。5.2组合逻辑电路设计需要注意的是,一般情况下,case语句并不适用于设计优先编码器。因为case语句在对输入条件进行判断时,电路会根据判断结果直接跳转到相应的分支,各个分支之间并没有内在的优先级顺序,只是单纯地根据输入值进行匹配。虽然理论上可以通过对case语句的一个分支进行嵌套设计来描述优先编码器,但这种嵌套结构在实际应用中会使代码变得复杂且不利于电路的优化,在综合生成硬件电路时可能会产生较多的逻辑资源消耗或者导致时序等方面出现问题,所以在实际设计优先编码器时,更推荐使用if-else语句。5.2组合逻辑电路设计5.2.2译码器译码器与编码器的功能恰好相反,它是把输入的二进制代码还原为对应的特定输出信号,是进行编码的逆操作,在数字系统中常用于地址译码、指令译码等多种场景,能够实现信息的扩展和还原,将经过编码压缩后的信息重新解读出来,使其能够驱动相应的电路模块或者执行特定的操作。以24译码器为例,输入2位二进制代码后,能将其“翻译”成4个输出信号中的某一个有效,以此确定对应的具体输出状态,实现了从二进制编码到具体输出信号的转换。24译码器功能见表53。5.2组合逻辑电路设计在Verilog中,可以使用不同的语句来描述24译码器,以下是两种常见的情况。【例5.8】if-else语句描述24译码器。5.2组合逻辑电路设计在这个模块定义中,输入端口in为2位宽度,用于接收要译码的二进制代码,输出端口out为4位宽度的寄存器类型信号,用于输出译码后的结果。在always块内,根据输入in的不同取值,将对应的输出out赋值为相应的译码结果。当in的值为2'b00时,输入的是最低编码值,此时将输出out赋值为4'b0001,表示只有最低位输出有效。以此类推,按照功能表的对应关系实现整个译码逻辑。【例5.9】case语句描述24译码器。5.2组合逻辑电路设计在这个模块定义中,输入端口in为2位宽度,用于接收要译码的二进制代码,输出端口out为4位宽度的寄存器类型信号,用于输出译码后的结果。在always块内,根据输入in的不同取值,将对应的输出out赋值为相应的译码结果。当in的值为2'b00时,输入的是最低编码值,此时将输出out赋值为4'b0001,表示只有最低位输出有效。以此类推,按照功能表的对应关系实现整个译码逻辑。【例5.9】case语句描述24译码器。5.2组合逻辑电路设计在这个模块定义中,增加了一个使能端口en,输出端口out为4位宽度的寄存器类型信号。在always块内的case语句中,根据输入in的不同取值进行相应的输出赋值操作,与前面if-else语句实现的功能类似,都是按照功能表的对应关系来确定输出值,只是使用了不同的语句结构来实现译码逻辑。24译码器的仿真波形如图55所示。5.2组合逻辑电路设计5.2.3数据选择器数据选择器又称多路选择器或多路开关,是一种在数字电路中常用的组合逻辑电路。其主要功能是从多个输入数据中根据选择信号选出一个作为输出。数据选择器通常有多个数据输入端口、一个或多个选择控制端口以及一个输出端口。通过改变选择控制端口的信号状态,可以决定哪一路输入数据会被传输到输出端口。在Verilog中,可以使用case语句来描述4选1数据选择器,如例5.10所示。【例5.10】case语句描述4选1数据选择器。5.2组合逻辑电路设计5.2.4运算电路运算电路可以实现数值的加减乘除等操作,也是数字系统设计中的常见电路。Verilog提供了各种运算符用于进行运算电路的设计。例5.11的代码描述了两个1位二进制数运算电路,该电路能实现加法、减法和乘法运算。【例5.11】1位二进制数加法、减法和乘法运算电路。5.2组合逻辑电路设计在这个模块定义中,定义了两个1位的输入信号op1和op2,分别用于接收参与运算的两个二进制数,同时定义了三个输出端口,其中sum用于输出加法运算的结果,sub用于输出减法运算的结果,mult为2位宽度,用于输出乘法运算的结果。通过三条连续赋值语句assign,分别利用Verilog提供的加法运算符+、减法运算符-和乘法运算符∗来实现相应的运算功能,简洁明了地构建了一个能够同时进行三种基本运算的1位二进制数运算电路。例5.11运算电路的仿真波形如图57所示。5.2组合逻辑电路设计例5.11运算电路的综合电路如图58所示。还可以使用结构化的设计方法,通过元件例化的方式调用已有的1位加法器等基础模块,来设计更为复杂的运算电路,比如n位串行加法器。例5.12为1位全加器模块的描述;例5.13通过调用该模块,设计了一个4位串行进位加法器。5.2组合逻辑电路设计【例5.12】1位全加器模块的设计。5.2组合逻辑电路设计通过两个连续赋值语句实现全加器的逻辑功能。对于sum的计算,采用了异或运算的组合,先将a和b进行异或运算,得到的结果再与进位输入cin进行异或运算,最终得到本次加法的和值。对于进位输出cout的计算,通过逻辑表达式(a&b)(cin&a)(cin&b)来实现。这个表达式涵盖了产生进位的三种情况:当a和b都为1时会产生进位;当a为1且有进位输入cin时会产生进位;当b为1且有进位输入cin时也会产生进位,通过或运算将这三种情况综合起来,确定是否向高位产生进位输出,从而实现1位全加器的功能。【例5.13】4位串行进位加法器的设计。5.2组合逻辑电路设计通过两个连续赋值语句实现全加器的逻辑功能。对于sum的计算,采用了异或运算的组合,先将a和b进行异或运算,得到的结果再与进位输入cin进行异或运算,最终得到本次加法的和值。对于进位输出cout的计算,通过逻辑表达式(a&b)(cin&a)(cin&b)来实现。这个表达式涵盖了产生进位的三种情况:当a和b都为1时会产生进位;当a为1且有进位输入cin时会产生进位;当b为1且有进位输入cin时也会产生进位,通过或运算将这三种情况综合起来,确定是否向高位产生进位输出,从而实现1位全加器的功能。【例5.13】4位串行进位加法器的设计。5.2组合逻辑电路设计例5.13中首先定义了一个名为carry的线网类型数组carry[0:4],这个数组用于存储每一位加法运算过程中产生的进位信号。通过assigncarry[0]=cin语句,将外部输入的进位信号cin赋值给最低位的进位信号carry[0],为整个进位传递链设置好了初始进位值。然后,通过元件例化语句调用之前定义好的1位全加器模块adder,构建起4位的加法器结构。4位串行进位加法器的综合电路如图5-9所示。这种串行进位是一种较为直观且容易理解的实现多位加法运算的方式,它按照从低位到高位的顺序依次进行每一位的加法运算,并将进位信号依次传递给下一位。但这种方式也存在一定的局限性,由于进位信号是依次传递的,每一位的运算都需要等待上一位的进位信号确定后才能进行,因此在运算速度上相对较慢,特别是当位数较多时,进位传递的延迟可能会对整个系统的性能产生一定影响。5.2组合逻辑电路设计5.2组合逻辑电路设计在实际应用中,可以根据具体的性能要求和设计场景来选择是否采用串行进位加法器,或者考虑采用其他更优化的进位方式,如超前进位加法器等来提高运算速度。同时,对于这个4位串行进位加法器,也可以通过进一步的模块封装和实例化,将其作为一个基础模块去构建更复杂的运算电路,比如构建8位、16位甚至更高位数的加法器;或者与其他运算模块,如减法器、乘法器等组合起来,实现更为复杂的算术逻辑单元,满足不同数字系统对数据运算处理的多样化需求。5.3时序逻辑电路设计5.3时序逻辑电路设计5.3.1时钟信号数字系统通常由多个逻辑部件组成,时钟信号为这些部件提供了统一的时间基准。各个部件在时钟信号的上升沿或下降沿进行同步操作,确保数据能够在不同部件之间有序、正确地传输和处理。触发方式分为边沿触发和电平触发两种。1.边沿触发在设计模块中,通常使用always块结合时钟信号的边沿触发来描述时序逻辑。语法格式如下:5.3时序逻辑电路设计在时钟信号clk的上升沿触发时,表示为always@(posedgeclk);而在下降沿触发时,则表示为always@(negedgeclk)。这两种边沿触发方式在不同的应用场景中各有优势。例如,某些对数据采样要求在时钟上升沿进行的电路中,如同步时序电路,采用posedgeclk触发,能保证数据在时钟上升瞬间被稳定地采集并进行后续处理;而对于某些特定的计数器或者状态机的状态转移等,negedgeclk就能发挥作用。此外,有些较为复杂的设计需要同时对时钟信号的上升沿和下降沿做出响应,那么表示时钟信号时可以写成always@(posedgeclkornegedgeclk)。这种设计场景可能出现在要求在一个时钟周期内的两个边沿都执行不同但相关逻辑操作的电路中,例如,在双边沿触发的计数器设计中,上升沿和下降沿分别对不同的计数规则或者进位逻辑进行处理,以此实现更复杂的计数功能或更高效的时序控制。2.电平触发电平触发是指在时钟信号处于高电平或低电平期间,电路会对输入信号进行响应和处理。只要时钟信号保持在该特定电平,电路就会持续地根据输入信号更新输出。例如,always@(clk)表示该always块会在时钟信号clk发生变化时被触发,这里的变化不仅局限于边沿的跳变,只要电平发生改变,都会触发always块内的逻辑执行。这种触发方式在一些对时钟电平敏感的电路设计中较为常用,比如某些简单的锁存器电路或者电平敏感型的状态机等。相较于边沿触发,电平触发方式在设计时需要考虑时钟信号的稳定性以及可能出现的毛刺等问题,因为在整个电平持续期间电路都处于响应状态,若电平出现不稳定波动,可能导致电路出现错误的逻辑行为。5.3时序逻辑电路设计5.3.2

D锁存器的设计锁存器在数字电路中的核心作用是把信号暂存,以此维持某种电平状态。D锁存器属于电平触的存储单元,当D锁存器的使能信号有效时,它相当于一个缓冲器,输入的任何变化都会实时地反映在输出上。这一特性使得它在一些需要快速传递信号且对实时性要求较高的场景中具有应用价值,比如在高速数据通路中,作为临时的数据缓存和传递单元,确保数据能够快速地从一个模块流转到另一个模块,减少信号传输延迟。当使能信号无效时,输出端的数据就会被锁住,输出不再随输入变化,从而实现了数据的暂存功能。例如在处理高速设备与慢速外设之间的不同步问题时,D锁存器就能发挥重要作用。由于不同设备的工作速度可能存在差异,通过锁存器可以将高速设备传来的数据在合适的时刻进行暂存,等待慢速外设能够接收并处理,有效地解决了两者的速度匹配问题。同时,它还能在一定程度上解决驱动的问题,增强信号的驱动能力,确保信号能够稳定地传输到后续的电路模块中。与触发器相比,D锁存器的优势是完成同一个功能所需要的逻辑门的数量相对较少,在硬件实现上可以占用更少的芯片面积,提高集成度,所以在专用集成电路设计中应用较为广泛。5.3时序逻辑电路设计例5.14给出了一个D锁存器的设计示例,要求当使能信号en为高电平时,输出随输入变化,当en变为低电平时,锁存数据。【例5.14】D锁存器的设计。5.3时序逻辑电路设计在例5.14模块定义中,明确了输入端口en(使能信号)、d(数据输入信号)以及输出端口q(数据输出信号)。在always块内,通过if(en)条件判断语句来实现锁存器的功能逻辑。当en为高电平时,满足条件,执行q<=d,即将输入d的值赋给输出q,体现了输出随输入变化的透明特性;而当en为低电平时,if条件不满足,always块内的赋值语句不会执行,输出q的值保持上一次的状态,实现了数据锁存的功能。综合电路如图510所示。仿真波形如图511所示,当en=1时,输出q会随着输入d的变化而即时变化;当en=0时,输出q则保持不变,体现了D锁存器的数据锁存功能。5.3时序逻辑电路设计在例5.14模块定义中,明确了输入端口en(使能信号)、d(数据输入信号)以及输出端口q(数据输出信号)。在always块内,通过if(en)条件判断语句来实现锁存器的功能逻辑。当en为高电平时,满足条件,执行q<=d,即将输入d的值赋给输出q,体现了输出随输入变化的透明特性;而当en为低电平时,if条件不满足,always块内的赋值语句不会执行,输出q的值保持上一次的状态,实现了数据锁存的功能。综合电路如图510所示。仿真波形如图511所示,当en=1时,输出q会随着输入d的变化而即时变化;当en=0时,输出q则保持不变,体现了D锁存器的数据锁存功能。5.3时序逻辑电路设计5.3.3

D触发器的设计时序电路的基本单元是触发器。触发器从逻辑功能上分,主要有D触发器、JK触发器、T触发器、RS触发器;从触发方式上分,有电平式触发器和边沿式触发器。不同的触发方式决定了触发器在何时对输入信号做出响应并更新输出状态。触发器不仅可以独立承担某种特定的功能,例如用于消除按键抖动、信号锁存等,更多的时候是作为中、大规模集成芯片的基本结构单元,多个触发器通过合理的连接和协同工作,能够实现如移位寄存、计数、数据存储等更为复杂且重要的功能。在触发器的设计与应用中,复位信号是一个关键因素,它用于设置触发器的初始状态,确保电路在出现异常情况后能够回到一个确定的有效状态。按照复位信号对触发器复位的操作不同,可以细分为异步复位和同步复位两种方式。这里的步异和同步指的是复位/置位信号与时钟触发信号是否同步。1.异步复位/置位D触发器异步控制信号是指该信号在任何时刻只要有效,就会对电路起作用,不必考虑有效时钟沿信号。例5.15是带有异步复位和异步置位功能的D触发器的Verilog描述。5.3时序逻辑电路设计【例5.15】异步复位/置位D触发器的Verilog描述。5.3时序逻辑电路设计在例5.15模块定义中,输入端口包括时钟信号clk、复位信号rst、置位信号set以及数据输入信号d,输出端口为数据输出信号q。在always块内,通过对时钟信号的上升沿以及复位、置位信号的低电平进行敏感列表设置,实现了异步控制功能。当复位信号rst出现低电平时,即!rst为真,无论时钟信号处于何种状态,都会立即将输出q赋值为1'b0,实现复位操作;当置位信号set出现低电平时,即!set为真,将输出q赋值为1'b1,完成置位操作;而在复位和置位信号都无效的情况下,当检测到时钟信号clk的上升沿时,将输入d的值赋给输出q,实现数据的正常传递功能。异步复位/置位D触发器的综合电路如图512所示。异步复位/置位D触发器的仿真波形如图513所示。5.3时序逻辑电路设计5.3时序逻辑电路设计2.同步D触发器与异步控制信号不同,同步信号是指该信号有效的同时必须有有效的时钟沿,才能对电路起作用。【例5.16】同步D触发器的Verilog描述。5.3时序逻辑电路设计例5.16模块中,always块内仅对时钟信号clk的上升沿敏感,只有在时钟上升沿到来时,才会判断使能信号en的状态。当en为高电平时,执行q<=d语句,将输入d的值赋给输出q,实现数据的传递;而在其他时刻,即使en信号发生变化,由于没有有效的时钟沿触发,输出q的值也会保持不变。同步D触发器的综合电路如图514所示。同步D触发器的仿真波形如图515所示。5.3时序逻辑电路设计例5.16模块中,always块内仅对时钟信号clk的上升沿敏感,只有在时钟上升沿到来时,才会判断使能信号en的状态。当en为高电平时,执行q<=d语句,将输入d的值赋给输出q,实现数据的传递;而在其他时刻,即使en信号发生变化,由于没有有效的时钟沿触发,输出q的值也会保持不变。同步D触发器的综合电路如图514所示。同步D触发器的仿真波形如图515所示。5.3时序逻辑电路设计5.3.4计数器的设计计数器是数字电路中最常见的时序逻辑电路之一,它的主要功能是对输入的时钟信号进行计数操作。计数器可以根据不同的需求进行设计。计数器可以分为不同的类别,按计数进制可分为二进制计数器、十进制计数器等;按计数增减趋势可分为加法计数器、减法计数器和可逆计数器;按计数器中触发器翻转是否同步可分为同步计数器和异步计数器。1.同步二进制加法计数器设计在同步计数器中,所有触发器的时钟信号都由同一个时钟源提供,这一特性使得所有触发器的状态更新是同步进行的,保证了计数过程在时间上的一致性和准确性,避免了因不同步更新可能导致的计数错误等问题。【例5.17】4位同步二进制加法计数器的Verilog描述。5.3时序逻辑电路设计5.3时序逻辑电路设计在例5.17的always块内,通过对时钟信号clk的上升沿以及复位信号rst_n的下降沿进行敏感设置,实现了计数器的基本功能逻辑。当rst_n为低电平时,无论时钟信号处于何种状态,都会立即将计数器count的值清零,实现复位操作,确保计数器能从初始状态开始计数;而在rst_n为高电平的情况下,每当检测到时钟信号clk的上升沿时,就会执行count<=count+1语句,使计数器的值加1,实现了对时钟脉冲的计数功能。同步二进制加法计数器的仿真波形如图516所示。在时钟上升沿,如果rst_n为高电平,计数器的值会按照二进制加法规则依次递增,验证了该计数器的功能符合设计预期,为进一步的电路调试和优化提供了依据。5.3时序逻辑电路设计2.十进制计数器设计十进制计数器是一种专门针对十进制计数需求设计的时序逻辑电路,它能够对输入脉冲进行计数,并且计数范围被限定为0到9,当计数值达到9,下一个脉冲到来时计数器会重新归零并开始新一轮计数,契合了人们习惯的十进制计数方式,在很多需要以十进制形式显示或处理计数结果的场合有着广泛应用。【例5.18】十进制加法计数器的Verilog描述。5.3时序逻辑电路设计2.十进制计数器设计十进制计数器是一种专门针对十进制计数需求设计的时序逻辑电路,它能够对输入脉冲进行计数,并且计数范围被限定为0到9,当计数值达到9,下一个脉冲到来时计数器会重新归零并开始新一轮计数,契合了人们习惯的十进制计数方式,在很多需要以十进制形式显示或处理计数结果的场合有着广泛应用。【例5.18】十进制加法计数器的Verilog描述。5.3时序逻辑电路设计在例5.18中,复位信号rst_n为低电平时,将计数器count清零;rst_n为高电平时,增加了一个判断条件,即当计数器的值等于十进制9时,在下一个时钟上升沿到来时,将计数器count的值重新设置为4'b0000,使其归零,计数值不等于9时,在时钟上升沿执行count<=count+1,实现正常的计数递增功能。十进制加法计数器的仿真波形如图517所示。5.3时序逻辑电路设计3.六十进制计数器设计六十进制计数器在时钟、计时器等需要特定计数范围的场合有着广泛应用,例如时钟的分钟部分的计数范围是0~59,通过六十进制计数器能够实现计时功能。【例5.19】六十进制计数器的Verilog描述。5.3时序逻辑电路设计在例5.19中,首先明确了输入/输出端口。clk为时钟信号,rst是复位信号,count是一个6位的寄存器变量,用于存储当前的计数值,其范围是0到59,overflow是溢出信号,用于指示计数器是否达到最大值59。在always块中,通过敏感列表@(posedgeclkorposedgerst)对时钟上升沿和复位信号上升沿进行监测。当复位信号rst有效,即rst为高电平时,执行count<=6'd0,将计数器的值清零,确保计数器回到初始状态,这在系统启动或者需要重置计时的情况下非常重要。当复位信号无效时,计数器开始正常计数。判断count是否等于59,如果等于59,说明已经达到六十进制的最大值,此时执行count<=6'd0,将计数器归零,准备开始新一轮计数;如果count不等于59,则执行count<=count+6'd1,使计数器的值增加1,实现正常的计数功能。六十进制计数器的仿真波形如图518所示。在正常计数过程中,随着时钟上升沿的不断到来,计数器的值逐渐递增,当计数值达到59时,在下一个时钟上升沿,计数器归零,同时溢出信号overflow变为高电平。5.3时序逻辑电路设计5.3时序逻辑电路设计5.3.5分频器的设计在数字电路系统中,不同的功能模块需要不同频率的时钟信号来驱动,分频器便应运而生。分频器的核心功能是将输入的时钟信号频率降低,把高频时钟信号转换为低频时钟信号,从而满足系统中不同模块对时钟频率的多样化需求。根据输出信号的脉宽特性,分频器可以分为等脉宽分频器和不等脉宽分频器两种类型。1.等脉宽分频器等脉宽分频器的输出信号的占空比为50%,输出信号的高电平和低电平持续时间相等,这种特性在一些对时钟信号对称性要求较高的电路设计中具有重要应用,例如在某些通信电路、高速数字信号处理电路中,对称的时钟信号有助于保证数据传输和处理的稳定性。实现等脉宽分频的常见方法是利用计数器对输入时钟信号进行计数操作。当计数值达到分频比的一半时,输出信号就会发生翻转,从而实现分频效果。【例5.20】4分频的等脉宽分频器的Verilog描述。5.3时序逻辑电路设计5.3时序逻辑电路设计在例5.20中,输入端口包括时钟信号clk和复位信号rst,输出端口为分频后的时钟信号out_clk。内部定义了一个2位的寄存器变量counter,用于对输入时钟信号进行计数。因为是4分频,所以2位二进制数可以表示0到3这4个状态,满足需求。在always块中,通过敏感列表@(posedgeclkorposedgerst)对时钟上升沿和复位信号上升沿进行监测。当复位信号rst有效时,执行counter<=2'b00和out_clk<=1'b0,分别将计数器清零和输出信号置为低电平,确保电路在复位时回到初始状态。当复位信号无效时,电路进入正常工作状态。在时钟上升沿,计数器开始计数。当counter的值等于2'b01时,已经计数到了分频比的一半,此时执行out_clk<=~out_clk,将输出信号翻转,counter继续加1。当counter等于2'b11时,即计数到了最大值3,再次翻转输出信号,并将counter清零,准备下一轮计数。在其他情况下,counter持续加1,以实现对时钟信号的准确分频。4分频的等脉宽分频器的仿真波形如图519所示。5.3时序逻辑电路设计2.不等脉宽分频器不等脉宽分频器与等脉宽分频器不同,其输出信号的占空比不为50%,高电平和低电平的持续时间不相等。这种分频器在需要控制特定设备工作时间长短的电路中,或者通信协议中对时钟信号占空比有特殊规定的情况下,能够满足需求。实现不等脉宽分频同样是借助计数器对输入时钟信号进行计数,与等脉宽分频器不同的是,它是在计数值达到特定值时,输出信号才会发生翻转。例5.21将输入时钟频率分频为1/5,且占空比为1

4,即高电平1个周期、低电平4个周期的不等脉宽分频器的Verilog设计。【例5.21】不等脉宽分频器的Verilog描述。5.3时序逻辑电路设计5.3时序逻辑电路设计在例5.21的always块中,当复位信号rst有效时,将计数器清零并把输出信号置为低电平。在正常工作时,当counter等于3'b100时,已经完成了一个5分频的周期,此时将输出信号置为高电平,并把计数器清零,开始下一个周期。当counter等于3'b000时,将输出信号置为低电平,计数器加1。在其他情况下,计数器持续加1。5分频的不等脉宽分频器的仿真波形如图520所示。输出信号out_clk在每5个时钟周期内,高电平持续1个周期,低电平持续4个周期,实现了分频比为1/5且占空比为1

4的功能。5.4状态机的设计5.4状态机的设计时序电路工作时,在有限状态之间按照一定的规律转换,这样的时序电路称为状态机。一个完整的状态机由外输入(包括复位信号、状态转移条件、输出条件)、外输出和若干状态元素组成。状态机是一种用于描述系统行为的数学模型,广泛应用于数字电路设计、软件工程、控制系统等领域。它的核心功能是将系统的行为分解为有限数量的状态,并定义状态之间的转移条件;根据当前状态和输入信号,决定系统的输出和下一状态;将复杂的逻辑分解为多个状态,使设计更清晰,且易于理解和维护。状态机按信号输出方式分,有Moore型和Mealy型两种状态机;按结构分,有单进程状态机和多进程状态机;按状态表达方式分,有符号化状态机和确定编码的状态机;按编码方式分,有顺序编码状态机、一位热码编码状态机和其他编码方式状态机。5.4.1状态机的基本结构完整状态机的结构通常包含说明部分,以及主控时序进程、主控组合进程、辅助进程等部分。一般状态机的结构框图如图521所示。clk为时钟信号,为状态机提供时序基准,用于同步状态机的状态转移。reset为复位信号,当有效时,将状态机复位到初始状态。state_inputs为状态输入信号,作为状态转移和输出逻辑的判断依据。comb_outputs为组合输出信号,根据当前状态和输入信号产生输出。5.4状态机的设计5.4状态机的设计1.说明部分说明部分用于定义状态机的状态、输入信号、输出信号以及其他必要的参数。提供状态机的整体框架和设计思路。使用parameter定义状态,例如,一个时序逻辑电路中用到3个状态,定义如下:5.4状态机的设计其中,state为状态变量名,有3个状态:s0、s1、s2。状态机需要定义一个复位状态,通常表示为s0,用于明确状态机的初始状态,在电路出现异常时,可使其从不定态中恢复。2.主控时序进程在状态机设计中,主控时序进程是状态机的核心部分之一,负责在时钟边沿或复位信号有效时,更新状态机的当前状态,将下一状态赋值给当前状态。主控时序进程需确保状态机的状态更新与时钟同步,避免冲突。在复位信号有效时,将状态机重置为初始状态。在Verilog中,主控时序进程通常使用always块实现,语法格式如下:5.4状态机的设计主控时序进程的时序逻辑使用非阻塞赋值,以确保状态更新

温馨提示

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

评论

0/150

提交评论