欢迎来到EDA中国!
当前位置:网站首页 >技术专栏 > FPGA

分拆大组合逻辑的方法

发布时间: 2013-07-06 17:49:24     来源: EDA中国

分拆大组合逻辑的方法

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

分拆大组合逻辑的方法 

图1




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




用加法器做例子,设输入ABCD输出OUT 上半部分就是: Out = 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 OUT = 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代码,而是在写代码前脑子里面要有。你需要实现的逻辑的电路结构。


关键字 : 组合逻辑 分拆 方法 
获取帮助