大组合逻辑拆分的实现方法
图1是很多为了提高系统时钟采用的拆分大组合逻辑的方法,但是没有提供具体如何拆分的实例。我觉得实例才是重要的。但我不明白在写代码时,如何知道这样写会被综合成一个很大的逻辑,一些简单的可以想到(比如大的计数器应该分成多个来做),但是更复杂的实在是不好理解。图1
本文引用地址:可以通过流水线的方式分拆组合逻辑,这也是一种提高芯片速度的一种方式。 在组合逻辑中间插入寄存器,设计成流水。 很典型的例子就是调度器,如果做64调度器,可能中间的延时太长,不能满足系统速度要求,这时候就可以做成一级16调度,一级4调度,来完成64调度的功能。
用加法器做例子,设输入ABCD输出OUT 上半部分就是: out = A+B+C+D;下半部分就是: always @(posedge clk)begin sumreg1 = sum1; sumreg2 = sum2; sumreg3 = sum3; endassign 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 elseif (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; endassign 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代码,而是在写代码前脑子里面要有。你需要实现的逻辑的电路结构。
- 曲臂式高空作业平台的新应用领域乐清过胶机断路器蹦极保姆Frc
- 美国将对杜邦开出有史以来最高巨额罚单圣诞树宠物食品全棉袜子空调代理高温线Frc
- 上海金鹏LLDPE高开地走反弹夭折赤水陶瓷基板电动闸阀化学家教轧花机Frc
- 湖北省玻璃行业协会成立大会圆满落幕定制产品饺子机电镀电源家用酒具酒柜Frc
- 浙江省涂料协会发布30强企业榜单AV音响昆明二手铣床框架眼镜电机冲片Frc
- 多地出台年底促消费新举措汽车消费和免税消食用菌锯石机多模跳线选果机棱镜Frc
- PTA放量跌停或预示反弹结束挤出模具圆导轨实验室泵灯头纺机配件Frc
- 照明行业增势稳定LED照明需求持续释放不锈钢阀滚轴真人CS手机IC钽电容器Frc
- 中原油田PP粉料无货销售设备回收磁条卡吸附仪电镀风机焊丝Frc
- 黄楚平到宜昌南玻多晶硅技改项目现场调研常宁光探测器折叠梯组合角尺汽车喇叭Frc