x
x

实现拆分大组合逻辑的方法

发布时间:2010-10-18 19:21    发布者:techshare
关键词: 拆分 , 逻辑 , 组合
图1是很多为了提高系统时钟采用的拆分大组合逻辑的方法,但是没有提供具体如何拆分的实例。我觉得实例才是重要的。但我不明白在写代码时,如何知道这样写会被综合成一个很大的逻辑,一些简单的可以想到(比如大的计数器应该分成多个来做),但是更复杂的实在是不好理解。



可以通过流水线的方式分拆组合逻辑,这也是一种提高芯片速度的一种方式。 在组合逻辑中间插入寄存器,设计成流水。 很典型的例子就是调度器,如果做64调度器,可能中间的延时太长,不能满足系统速度要求,这时候就可以做成一级16调度,一级4调度,来完成64调度的功能。

用加法器做例子,设输入ABCD输出OUT 上半部分就是: ut = A+B+C+D;

下半部分就是:

always @(posedge clk)

begin

sumreg1 <= sum1;

sumreg2 <= sum2;

sumreg3 < = sum3; end

assign sum1 = A+B;

assign sum2 = C+D;

assign sum3 = sumrge1+sumreg2;

assign UT = sumreg3;

通常建议使用下半部分的算法,如果可以使用流水线。

通常是这样的,没有例子看起来是不好理解,但是一有具体的例子就非常清楚了。我也来学着给个计数器的例子计数255,如果用一个寄存器来计那么需要开的深度为8的,如果拆分为两个那么只需容量为4的两个寄存器,所需的逻辑较小,不知道对不对。

reg[3:0]ad1;

reg[3:0]ad2;

always @(posedge clk)

if(!rest)

begin

out<=0;

ad1<=0;

ad2<=0;

end

else

if(ad1==15)

begin

ad2<=ad2+1;

ad1<=0;

end

else

if (ad2==15)

begin out<=1;

end

else

ad1<=ad1+1;

ad1加满后去触发ad2加。

always @(posedge clk)

if (reset)

counter0 = 0;

else

counter0 = counter0 + 1;

always @(posedge clk)

begin

counterreg0 <= counter0;

if (counterreg0 == 4'b1111)

outreg0 <= 1;

else

outreg0 <= 0;

end

assign counter1 = counterreg1 + outreg0;

always @(posedge clk)

begin

counterreg1 <= counter1;

if (counterreg1 == 4'b1111)

out <= 1;

else

out <= 0;

end

lflhust 写的程序没有达到逻辑拆分的目的, 原因很简单, 那个程序综合后生成的电路的流水线深度还是1。 zf0579那个程序的流水线深度才是2,达到了拆分的目的。 作逻辑的出发点不是写HDL代码,而是在写代码前脑子里面要有 你需要实现的逻辑的电路结构。

作逻辑的出发点不是写HDL代码,而是在写代码前脑子里面要有。你需要实现的逻辑的电路结构。
本文地址:https://www.eechina.com/thread-33157-1-1.html     【打印本页】

本站部分文章为转载或网友发布,目的在于传递和分享信息,并不代表本网赞同其观点和对其真实性负责;文章版权归原作者及原出处所有,如涉及作品内容、版权和其它问题,我们将根据著作权人的要求,第一时间更正或删除。
您需要登录后才可以发表评论 登录 | 立即注册

厂商推荐

  • Microchip视频专区
  • Cortex-M4外设 —— TC&TCC结合事件系统&DMA优化任务培训教程
  • 深度体验Microchip自动辅助驾驶应用方案——2025巡展开启报名!
  • 我们是Microchip
  • 利用模拟开发工具生态系统进行安全电路设计
  • 贸泽电子(Mouser)专区

相关视频

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
快速回复 返回顶部 返回列表