参考文献
https://zhuanlan.zhihu.com/p/681576858
参考文献
https://blog.csdn.net/dongdongnihao_/article/details/79589223?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-1-79589223-blog-145356163.235%5Ev43%5Epc_blog_bottom_relevance_base4&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-1-79589223-blog-145356163.235%5Ev43%5Epc_blog_bottom_relevance_base4&utm_relevant_index=1
参考文献
https://www.elecfans.com/pld/2038544.html
参考文献
常见的组合逻辑电路
https://wenku.baidu.com/view/a6235355a6e9856a561252d380eb6294dd8822df.html?wkts=1746935279291&bdQuery=%E5%B8%B8%E8%A7%81%E7%9A%84%E7%BB%84%E5%90%88%E9%80%BB%E8%BE%91%E7%94%B5%E8%B7%AF
参考文献
always组合逻辑块的讲解和译码器的实现
https://m.elecfans.com/article/2087791.html
参考文献
掌握FPGA核心:Verilog HDL语法与高效框架全面解析
https://baijiahao.baidu.com/s?id=1822973457213089056&wfr=spider&for=pc
参考文献
verilog基础—always - hhh-fpga
https://www.cnblogs.com/hhh-fpga/p/14896880.html
参考文献
硬件基础:时序逻辑电路
https://blog.csdn.net/qq_28576837/article/details/135854536
文章目录
前言
本文介绍组合逻辑和时序逻辑的基础内容。
一、组合逻辑
1.组合逻辑电路
组合逻辑电路,是指在任何时刻,电路的输出状态只取决于同一时刻的输入状态,与电路原来的状态无关。
组合逻辑不会保留前一时刻的值,当前的输入一变化,输出立刻变化。
常见的组合逻辑电路:译码器、多路选择器等。
2.组合逻辑的表示方法
组合逻辑的表示方法包括真值表和布尔代数。
(1)真值表
输入的所有组合与其对应的输出值构成的表格
真值表的特点:
能完全描述任何一种组合逻辑
表的大小随输入个数的增加呈指数增长
(2)布尔代数
布尔代数中有3种基本运算,与、或、非。
常见的布尔代数定律如下表所示
3.基础结构门电路
门电路可以实现基本的逻辑功能。
基本的门电路的符号如下:
也可以用下面这种符号表示:
4.组合逻辑的verilog描述
组合逻辑的特点是任意时刻的输出仅仅取决于该时刻的输入,与电路原本的状态无关,逻辑中不牵涉跳变沿信号的处理,组合逻辑的verilog描述方式有两种:
(1):always @(电平敏感信号列表)
always模块的敏感列表为所有判断条件信号和输入信号,但一定要注意敏感列表的完整性。在always 模块中可以使用if、case 和for 等各种RTL 关键字结构。
由于赋值语句有阻塞赋值和非阻塞赋值两类,建议使用阻塞赋值语句“=”。
always 模块中的信号必须定义为reg 型,不过最终的实现结果中并没有寄存器。这是由于在组合逻辑电路描述中,将信号定义为reg型,只是为了满足语法要求。
(2):assign描述的赋值语句。
信号只能被定义为wire型。
二、时序逻辑
1.时序逻辑电路
时序逻辑电路,是指电路在任一时刻的输出不仅与当前时刻的输入有关,还与当前时刻的电路状态有关。
组合逻辑电路中,任一时刻的输出信号仅仅由该时刻的输入信号所决定,而时序电路在任一时刻的输出信号不仅与当时的输入信号有关,而且与电路原来的状态有关。
也就是说,时序电路中除具有逻辑运算功能的组合电路外,还必须有能够记忆电路状态的存储单元或延迟单元,这些存储或延迟逻辑单元主要由锁存器或触发器组成。
时序电路的基本结构如下图所示,它由完成逻辑运算的组合电路和起记忆作用的存储电路两部分构成。其中,存储电路由触发器或锁存器组成。
时序逻辑=存储元件+组合逻辑
输入信号:I=(I1、I2,…,Ii) ;
输出信号:O=(O1、O2,…,Oj) ;
激励信号:E=(E1、E2,…,Ek) ,可以驱动存储电路转换为下一状态;
状态信号:S=(S1、S2,…,Sm) ,表示存储电路的状态,亦称为状态变量;它表示时序电路当前的状态,简称现态。
状态变量 S 被反馈到组合电路的输入端,与输入信号 I 一起决定时序电路的输出信号 O ,并产生对存储电路的激励信号 E ,从而确定电路的下一状态,即次态。
时序电路具有以下主要特征:
①时序电路由【组合电路】和【存储电路】组成。
②时序电路的输出信号由【输入信号】和【之前的电路状态】共同决定。
时序电路可分为:异步时序电路和同步时序电路
若电路中触发器的时钟输入端没有连接在统一的时钟脉冲上,或电路中没有时钟脉冲(如SR 锁存器构成的时序电路),从而电路中各存储单元的状态更新不是同时发生的。则这种电路称为异步时序电路。
与异步时序电路不同,同步时序电路中存储电路状态的转换是在同一时钟脉冲源的同一边沿作用下同步动作的。
同步时序电路的存储电路一般用触发器实现,所有触发器的时钟输入端都应接在同一个时钟脉冲源CP上,而且它们的时钟脉冲触发沿也都应一致。因此,所有触发器的状态更新是在同一时刻,其输出状态变换的时间差异很小。
在时钟脉冲两次作用的间隔期间,从触发器输入到状态输出的通路被切断,即使此时输入信号发生变化,也不会改变各触发器的输出状态,所以较少发生因状态转换不同步而引起的输出状态不稳定的现象。更重要的是,其电路的状态很容易用固定周期的时钟脉冲边沿清楚地分离为序列步进。
常见的时序逻辑电路:寄存器、计数器等。
2.时钟信号
时钟信号是指有固定周期并与运行无关的信号量,它是时序逻辑的基础,决定了逻辑单元中状态何时更新。
在电平触发机制中,只有高电平(或低电平)是有效信号
在边沿触发机制中,只有上升沿(或下降沿)是有效信号
3.时序逻辑的verilog描述
时序逻辑是Verilog HDL 设计中另一类重要应用,其特点为任意时刻的输出不仅取决于该时刻的输入,而且还和电路原来的状态有关。
电路里面有存储元件(各类触发器,在FPGA 芯片结构中只有D 触发器)用于记忆信息,从电路行为上讲,不管输入如何变化,仅当时钟的沿(上升沿或下降沿)到达时,才有可能使输出发生变化。
与组合逻辑不同的是:
(1)在描述时序电路的always块中的reg型信号都会被综合成寄存器,这是和组合逻辑电路所不同的。
(2)时序逻辑中推荐使用非阻塞赋值“<=”。
(3)时序逻辑的敏感信号列表只需要加入所用的时钟触发沿即可,其余所有的输入和条件判断信号都不用加入,这是因为时序逻辑是通过时钟信号的跳变沿来控制的。
三、何时用组合逻辑或时序逻辑
1.两种逻辑比较
设计两个无符号的8bit数据相加的电路。
(1)组合逻辑设计代码:
对应的电路为:
(2)时序逻辑设计代码:
对应的电路为:
可以思考一下,这个两种设计方法都没有任何错误。那么在设计时应该用哪一种呢?
在设计时,有没有什么规定必须要用组合逻辑或者时序逻辑?例如:在verilog中,在always中被赋值了就必须是reg类型,assign赋值了就必须是wire类型。很遗憾的是,目前没有任何的规定。
2.带有反馈的必须用时序逻辑
何为带有有反馈?即输出结果拉回到输入。
(1)不正确的情况
1}自加一计数器。
代码为:
对应的电路为:
这种电路在工作时,就会出现无限反馈,不受任何控制,一般情况下,我们认为结果没有任何意义。
2)和上面的情况类似的还有取反。
3)还有一种情况是带有控制的反馈。
设计代码为:
这个电路可以等效为:
在flag等于1期间,此电路依然会无限制的反馈,无法确定在此期间进行了多少次反馈。
从代码的角度理解是flag变化一次,加一次。可是对应于电路后,和预想的是不相同的。
(2)正确的情况
clk每来一个上升沿,cnt的数值增加一。可以用作计时使用。
设计代码为:
利用寄存器将反馈路径切换即可。此时的反馈是可控制,并且此时的结果就有了意义。
其他的反馈中,加入寄存器即可。而加入寄存器后,就变为时序逻辑。
3.根据时序对齐关系进行选择
在很多的设计时,没有反馈,那么应该如何选择呢?
举例说明:输入一个八位的数据(idata),然后将此八位数据进行平方后,扩大2倍,作为输出。要求输出结果(result)时,将原数据同步输出(odata),即数据和结果在时序上是对齐的。
(1)不正确的情况
一种不正确的时序逻辑设计代码为:
这种设计方法为错误,odata的输出是和idata同步的,而result的输出将会比idata晚一拍,最终导致result要比odata晚一拍,此时结果为不同步,设计错误。
(2)正确的情况
第一种,修改方案为:将result的寄存器去掉,修改为组合逻辑
这种设计方法是可以的,因为都采用组合逻辑设计,odata和result都是和idata同步的,只有逻辑上的延迟,没有任何时钟的延迟。
第二种,为将odata也进行时序逻辑输出,那么此时odata也将会比idata延迟一拍,最终结果为result和odata同步输出。
4.根据运行速度进行选择
(1)存在问题
在数字逻辑电路中,中间某一部分为组合逻辑,两侧的输入或者输出也会对延迟或者输入的数据速率有一定的要求。
组合逻辑1越复杂延迟越大,而导致的结果就是clk的时钟速率只能降低,进而导致设计结果失败。
(2)解决方法
当组合逻辑1无法进行优化时,还想要达到自己想要的速度时,我们可以进行逻辑拆分,增加数据的输出潜伏期,增加数据的运行速度。
将组合逻辑1的功能拆分为组合逻辑A和组合逻辑B,此时,输入的数据得到结果虽然会多延迟一拍,但是数据的流速会变快。
那么这个和选用组合逻辑和时序逻辑有什么关系呢?
举例说明:目前要设计模块A,不涉及反馈,不涉及时序对齐等,可以采取组合逻辑设计也可以采用时序逻辑设计。
模块A的输出连接到模块B,经过一些变换(组合逻辑N)连接到某个寄存器K上。如果模块A采用组合逻辑,那么模块A的组合逻辑和模块B到达寄存器K之前的组合逻辑N会合并到一起。那么此时组合逻辑的延迟就会变得很大,导致整体设计的时钟速率上不去。
当运行速率比较快时,建议对于复杂的组合逻辑进行拆分,有利于时序分析的通过。
总结
本文介绍组合逻辑和时序逻辑的概念和使用方法,有利于大家对硬件描述语言的理解。。