电子开发网
您的位置电子开发网>EDA技术>

如何拆分大的组合逻辑?

时间:2009-10-14   来源:   作者:   点击:……  字体大小:【

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

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

zf0579:
用加法器做例子,设输入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;
通常建议使用下半部分的算法,如果可以使用流水线。

lflhust:
通常是这样的,没有例子看起来是不好理解,但是一有具体的例子就非常清楚了。我也来学着给个计数器的例子计数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加。

zf0579:
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:
zf0579 你好,麻烦你说明一下你写的这个思路是什么? 我写的那个能不能达到组合逻辑拆分的目的,谢谢! 你有没有这方面的资料,我有这样的思想,但是实际中还是很难写出程序来,这也行主要是看的太少了。

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

zf0579:
Chips一语中的,楼主当牢记所言。

lflhust:
作逻辑的出发点不是写HDL代码,而是在写代码前脑子里面要有。你需要实现的逻辑的电路结构。真是金玉良言呀,谢谢!


Tags:组合逻辑    
  • 关于本站 - 联系我们 - 网站地图 - 网站留言 - 返回顶部