时序电路HDL讲解.docVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
时序电路HDL讲解

前几节,我们讲解的都是组合逻辑电路。通过这些组合逻辑电路,我们初步掌握了VHDL常用的语法结构。从这节开始,我们要介绍时序电路了。(其实我们没有刻意去分组合和时序,只是觉的前面组合讲的多点,后面可能会多讲些时序电路而已。对小平爷爷曾经说过:不管黑猫,白猫,只要能捉到老鼠的猫就是好猫。所以不论时序,组合,还是时序和组合的混合体,只要能实现功能的就是好程序!) 说一下概念:异步和同步。这是时序电路的两大类。同步就是电路的触发器由同一个时钟信号驱动,在同一个时刻翻转;而异步就是不在同一个时刻翻转。大多数编程器的的内部结构是同步时序逻辑电路。 我们以时序电路的基础单元D触发器说起。 上升沿D触发器逻辑符号: 上升沿D触发器功能表: D Q 0 1 1 1 1 0 1 1 X X ↑ ↑ X X 0 1 0 1 0 1 1 0 1 0 由功能表可知,一个D触发器有一个异步置零端,异步置1端,只要或有效(低电平),则D触发器就会立即复位或则置1操作,复位与置1操作是与是时钟无关的,是异步的,有一个输入端D,一个时钟输入端CP,有两个互补的输出端Q和 源代码:(工程见example中的D_FF文件夹) 逐行解释: 19~33:是一个有嵌套的IF结构。这个IF结构就是按照功能表的顺序来写的。 25:是一条功能表没有的语句,在这种情况下,信号输出不确定,即用’X’来表示。这儿要考虑到选择信号的完备性:Rd和Sd的组合会形成4种可能,若没有第25句的话,那么28~32可在Rd=’0’且Sd=’0’和Rd=’1’ 且Sd=’1’两种情况下运行。这个是不符合功能要求的。这里提醒大家一句:编写程序,不仅仅是VHDL程序,心一定要细。 29:用到了一个内置函数rising_edge(),即表示信号的上升沿,相对的就是falling_edge()。该句等同于(if CP’event and CP=’1’),意思是CP上有事件发生,且事件发生后CP是高电平。(事件无非就是上升和下降,若事件后是高电平,那就是上升沿发生了!)这两个函数在以后会经常用到的。 注意:因为是Sd,Rd是异步信号,即该信号不等待时钟的某一状态,而是直接起作用。所以对这两种信号的判断应该在时钟的判断之前,即放在第29句之前判断。 再介绍下寄存器和移位寄存器这两种单元电路的实现,它们是数字电路中许多复杂时序电路的基础。掌握它们的VHDL描述也很重要。 先介绍由D触发器构成的8位寄存器74LS374. 8位寄存器74ls374逻辑符号: 8位寄存器74ls374功能表: 输入 输出 oe clk d0-d7 q0-q7 0 ↑ d0-d7 0 0 x 1 x x d0-d7 保持q0-q7 高阻Z 由功能表可知:74LS374有一个时钟输入端,8个数据输入端d0-d7,一个三态控制端oe和8个数据输出端d0-d7。当oe=0(有效)且时钟上升沿到来时,数据d0-d7送到输出端q0-q7;当oe=0(有效)但时钟上升沿没有到来时,寄存器输出端维持原来的状态;当oe=1(无效时)寄存器输出端维持高阻态。 源代码: 波形仿真图: 逐行解释: 我想这里只有两点需要解释和提醒一下: 每个IF都有一个END,不要遗漏了。还要注意哪个IF条件在外面,哪个IF条件在里面。如第21句的IF就是在第20句的IF里面的。 第25句:这是一种化简写法,就是说Q的所有内容都是Z,等同于Q=”ZZZZ_ZZZZ”。这里只有8个Z,写起来还简单些。但当Q为32位或则64位时,难道还真去写这么多个Z啊?眼睛都看花了。呵呵,所以呢,有了这个OTHERS=’Z’的偷懒写法。(OTHERS右边的值可任意设定的,Z只是个举例) 趁热打铁,再来一个循环左移位寄存器。(工程见example下的left_shifter_loop文件夹) 左循环移位寄存器。 假如左移3位,则移动示意如下图所示: 根据移动关系可得到如下的移动计算公式(简单的小学数学问题): ⅰ若当前数据位的当前序号(0—7)加上移动的次数大于数组长度(这里的数组长度是实际数组长度-1,如是8位的长度,则减一就是7),则该位将移动到:当前序号+移动次数-数组长度-1 ⅱ若当前数据位的序号加上移动的次数小于数组长度,则该位移动到:当前序号+移动次数 根据如上的计算方法,就可以编写出循环左移的程序。 程序代码如下: 逐行解释: 18:移动次数暂存寄存器。最大就移动8次。 22-23:当load=0时,将移动次数装载进来,conv_integer()将std_logic_vector转变为integer后赋值给CNT_S。 25-35:当上升沿来后,通过一个for循环进行

文档评论(0)

linjuanrong + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档