实验二时序逻辑电路的设计文档格式.docx
《实验二时序逻辑电路的设计文档格式.docx》由会员分享,可在线阅读,更多相关《实验二时序逻辑电路的设计文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
![实验二时序逻辑电路的设计文档格式.docx](https://file1.bdocx.com/fileroot1/2022-12/30/c4708160-2213-4a09-a337-dd30c372ce50/c4708160-2213-4a09-a337-dd30c372ce501.gif)
组合逻辑电路中不包含记忆单元(触发器、锁存器等),主要由逻辑门电路构成,电路在任何时刻的输出只和当前时刻的输入有关,而与以前的输入无关。
时序电路则是指包含了记忆单元的逻辑电路,其输出不仅跟当前电路的输入有关,还和输入信号作用前电路的状态有关。
2、同步时序逻辑电路的设计方法
同步时序逻辑电路的设计是分析的逆过程,其任务是根据实际逻辑问题的要求,设计出能实现给定逻辑功能的电路。
同步时序电路的设计过程:
(1)根据给定的逻辑功能建立原始状态图和原始状态表。
①明确电路的输入条件和相应的输出要求,分别确定输入变量和输出变量的数目和符号;
②找出所有可能的状态和状态转换之间的关系;
③根据原始状态图建立原始状态表;
(2)状态化简---求出最简状态图。
合并等价状态,消去多余状态的过程称为状态化简。
等价状态:
在相同的输入下有相同的输出,并转换到同一个次态去的两个状态称为等价状态。
(3)状态编码(状态分配)。
给每个状态赋以二进制代码的过程。
根据状态数确定触发器的个数,
(M为状态数;
n为触发器的个数)。
(4)选择触发器的类型。
(5)求出电路的激励方程和输出方程。
(6)画出逻辑图并检查自启动能力。
3、时序逻辑电路的特点及设计时的注意事项
①时序逻辑电路与组合逻辑电路相比,输出会延时一个时钟周期。
②时序逻辑电路一般容易消除“毛刺”。
③用VHDL描述时序逻辑电路时,一般只需将时钟信号和异步控制(如异步复位)信号作为敏感信号。
④用IF语句描述时序逻辑电路时,异步控制逻辑应写在前面的分支中,最后一个ELSIF分支作为时钟边沿检测,后面不允许再有ELSE语句。
⑤不能同时使用时钟的上升沿和下降沿。
四、实验内容:
1、带异步清零和异步置数的十进制加法计数器设计。
如图2.1所示,clk为时钟输入,Q为十进制的8421BCD码输出,CO为进位输出,CR为异步清零,LD为异步置数,CR具有最高优先级,D为LD有效时置入的数据。
(CR、LD一般用按钮控制,通常为低电平有效。
)
下图是计数器VHDL代码及仿真波形,注意观察计数输出Q、进位输出CO的变化情况,CR和LD的控制作用。
图2.3计数器VHDL代码及仿真波形
2、数控分频器的设计。
要求:
将10KHz时钟信号分频,分别输出10Hz、1kHz、1250Hz时钟信号,如图2.2所示。
分频的原理与计数器差不多,需要定义一个信号量来控制计数范围为分频数,另外控制在在一个计数周期内输出一段低电平“0”和另一段高电平“1”。
分频器部分源码如图2.4a、图2.4b所示:
图2.4a数控分频器VHDL代码
如果用于计数的信号量定义为“std_logic_vector”类型的。
如“Count10”,也可以将其最高位作为分频后的时钟输出:
即使用语句“Clk_1kHz<
=Count10(3);
”,此时输出时钟信号占空比是多少?
是否可以改变?
。
如果分频数为2n,“n为整数”,如8分频,Count8定义为“std_logic_vector”类型,使用下图的语句序列实现,更加简洁:
图2.4b数控分频器VHDL代码
同理,“Count8
(1)”是几分频输出?
“Count8(0)”是几分频输出?
3、8位七段数码管扫描电路设计。
①图2.5是实验箱中的八个数码管电路连接图,可以看到,八个数码管的a、b、c、d、e、f、g、h、dp都连在了一起,8个数码管分别由各自的位选信号来控制,被选通的数码管显示数据,其余关闭。
SEL[2..0]从“000”、“001”一直加到“111”,则八个数码管依次从左到右显示。
如果SEL[2..0]变化频率很高,则数码管好像是“同时”显示的效果。
②要实现8位数码管扫描,首先应设计一个计数器,让SEL从“000”、“001”一直加到“111”,实际上就是一个八进制计数器。
如图2.6的简单代码即可实现:
图2.6八位数码管扫描代码
SEL[2..0]的值即可确定数码管的位置,如要将“BCD码加法器”或“4位硬件乘法器”的结果用数码管显示,可以再设计一个组合逻辑电路,用于选通数码管,使各个数字或符号显示在对应位置,如图2.7所示。
图2.7八位数码管选通
注:
图2.7的代码使用组合逻辑电路实现,如果用时序逻辑电路实现,则前几句应改为:
为什么这里的CASE语句判断的是“SEL+1”?
完整的代码如图2.8:
图2.8数码管扫描选通模块VHDL代码
为了显示“×
”号、“=”号、“消隐”,将BCD码扩展一位为5位,最高位为0即“00000”~“01111”表示原来的十六进制编码0~F,最高位为1的编码用于显示特殊字符,如“10000”用于“=”号,“10001”用于“×
”号,“11111”表示“消隐”,译码模块代码做相应改变如图2.9所示:
图2.9扩展一位BCD码输入后的译码器代码
③层次化电路设计及元件例化:
a)任何一个电路都可以看作是一个“元件”,我们只需要关心它的功能,而不需要了解它的具体实现。
b)“元件”与其它电路的连接可以通过端口映射实现。
c)“元件”使用,可以通过“元件例化”实现,VHDL语言有专门的“元件例化”和“端口映射”语句。
操作步骤请参考“元件例化和调用的操作步骤”部分。
④将“BCD码加法器”(或“4位硬件乘法器”)、“BCD译码器”、“8位七段数码管扫描电路”的功能组合在一起,实现在数码管上显示结果,下载到实验箱进行测试。
如图2.10所示(注:
图中“sel_time”模块和“deled”的BCD码扩展到5位,以显示“×
”号、“=”号等特殊符号):
图2.10在数码管上显示乘法器结果
4、4位硬件乘法器的流水线设计
流水线结构因其高速性在很多数字电路中得到了广泛的应用,目前的DSP、ARM等器件也是基于流水线结构的。
本实验就是在掌握“4位硬件乘法器”实验的基础上,将其改为流水线结构,从而提高其运算速度。
流水线可以简单的理解为在时钟的作用下,每一拍完成一个简单运算。
需要注意的是,由于内部的运算都是在时钟作用下进行,所以涉及到运算的中间变量都必须定义成寄存器结构的。
另外对于一次运算可能要经过多个时钟周期才能得到结果,但是如果对于批量的数据,就可以认为是单周期得到运算结果。
所以流水线结构的乘法器在对于单个运算时它的高速性并不能得以体现,只有在批量数据运算过程中才能体现出其高速性。
本实验中的流水线乘法器针对无符号型的数据(对于有符号型的数据还必须进行符号扩张),大体上可以分为四拍,第一拍:
取数据并作适当整理;
第二拍:
位乘法;
第三步:
加法第一步;
第四拍:
加法第二步,得到运算结果。
流水线结构的乘法器可以用下图2.11来简要表示:
图2.11流水线结构乘法器示意图
乘法器在时钟信号Clock的作用下,第一个时钟信号上升沿的时候第一拍先取数据,第二个时钟上升沿时候第一拍对取得的数据进行位乘,同时第二拍开始取数据,第三个时钟上升沿的时候第一拍进行第一步加法运算,第二拍进行位乘,同时第三拍开始取数据,第四个时钟上升沿的时候第一拍完成第二次加法并送出结果,第二拍则完成第一步加法,第三拍完成位乘,同时第四拍完成取数据,再往后走,会每一个时钟周期送出一个运算结果。
这就是为什么流水线结构的乘法器在单次运算的过程中它的高速性不能得到体现原因。
图2.12流水线结构乘法器的主要源码
图2.12是流水线结构乘法器的主要源码,其中应定义Temp0、Temp1、Temp2、Temp3、Temp01、Temp23几个信号量存储中间结果。
图2.13的仿真波形中,每个时钟周期改变一次输入,可以看到每个时钟周期出来一个输出结果,输出结果相比A、B延后3个时钟周期。
图2.13流水线结构乘法器的仿真波形
可以按图2.14连接电路测试,其中数码管扫描用1kHz时钟,乘法器用1Hz时钟,并用一个LED指示灯显示时钟节拍;
每一个时钟节拍改变一次输入,注意观察输出节拍。
”号、“=”号等特殊符号。
图2.14流水线结构乘法器的测试电路
5、4位硬件乘法器的状态机设计
流水线乘法器速度快,但是占用资源较多,特别是当乘数的位数很大时。
如果乘法操作比较少,或对速度要求不高的应用,可以采用串行方式实现乘法器。
下面是用状态机实现串行乘法器的实例:
①状态机可以模拟计算机CPU的运行机制,完成非常复杂的控制逻辑。
状态机有多种结构,有关状态机的知识请参考相关书籍,本例采用单进程状态机设计,比较易于消除毛刺,但输出结果会延时一个时钟周期。
②图2.15是本设计的状态图,一共4个状态,S0态接收输入,S1态将当前位加到m_result,S2态对A、B进行移位操作,S3态输出结果。
状态转换条件在后面的源码中讲述。
图2.15串行乘法器的状态转换图
③图2.17是状态机的VHDL实现源码,可以看到整个设计只用到一个8位加法电路,而“4位流水线乘法器”需要3个,当乘法位数很大时,串行加法器可以节约更多的硬件资源,但需要的时钟周期数更多。
④图2.16是仿真波形,注意观察需要几个周期才能输出结果(与A的值有关),A、B的值需要维持几个周期才能保证结果的正确性?
图2.16串行乘法器的仿真波形
⑤电路测试方法与“流水线乘法器”相似。
五、实验步骤:
1.首先打开QuartusII软件,新建工程。
2.按照自己的想法,编写原理图或VHDL文件程序。
3.对自己的设计进行编译并仿真。
4.仿真无误后,根据附录一的引脚对照表,对实验中用到的拨挡开关及LED进行管脚绑定,然后再重新编译一次。
5.用下载电缆通过JTAG接口将对应的sof文件下载到FPGA中(“计数器”和“分频器”只需仿真,不需要下载)。
6.观察实验结果是否与自己的预期想法相吻合。
六、实验报告要求
1.总结时序逻辑电路与组合逻辑电路的区别。
2.论述时序逻辑电路设计、分析和测试方法。
3.总结模块化层次电路设计的方法。
4.以单进程状态机为例总结状态机设计的几个要点。
5.分析三种乘法器的结构特点及各自的优势。