逻辑设计心得_数字逻辑课程设计心得
逻辑设计心得由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“数字逻辑课程设计心得”。
序
很早之前就想对这几个月工作经历写的东西,一是作为自己的总结,二是自己也很 想将自己这段时间的一些经历和大家分享一下,希望对初学者而言能使得他们能少走一 些弯路。只是公司里的事情很多,最近经常加班,所以一直拖到现在。
能来到这家公司应该是一种缘份--缘起NIOS。当初三月份altera来我们学校建立SO PC实验室的时候自己还不知道NIOS是什么东西,只是想在altera的FAE讲完NIOS后多问他 几个时序约束的问题,然后拷一份PPT回去。但是想不到因为那一份NIOS的培训资料,我 认识了edacn上的cawan,他给我讲了很多NIOS的东西,之后是丁哥在SOC版帖了位NIOS大 赛的通知,然后我和队友就去报了名,并去川大参加了NIOS的培训,认识了峻龙的FAE------o|> | | | / clk |--------|---------10)禁止用计数器分频后的信号做其它模块的时钟,而要用改成时钟使能的方式,否则这种时钟满天飞的方式对设计的可靠性极为不利,也大大增加了静态时序分析的 复杂性。如FPGA的输入时钟是25M的,现在系统内部要通过RS232与PC通信,要以rs232_ 1xclk的速率发送数据。不要这样做: always(posedge rs232_1xclk or negedge rst_n)begin...end 而要这样做:
always(posedge clk_25m or negedge rst_n)begin...else if(rs232_1xclk == 1'b1)...end 11)状态机要写成3段式的(这是最标准的写法),即...always @(posedge clk or negedge rst_n)...current_state
s2: b
1)Ensure Clock, Preset, and Clear configurations are free of glitch es.2)Never use Clocks consisting of more than one level of combinatori al logic.3)Carefully calculate setup times and hold times for multi-Clock sy stems.4)Synchronize signals between flipflops in multi-Clock systems when the setup and hold time requirements cannot be met.5)Ensure that Preset and Clear signals do not contain race conditio ns.6)Ensure that no other internal race conditions exist.7)Register all glitch-sensitive outputs.Synchronize all asynchronous inputs.9)Never rely on delay chains for pin-to-pin or internal delays.10)Do not rely on Power-On Reset.Use a master Reset pin to clear al l flipflops.11)Remove any stuck states from state machines or synchronous logic.其它方面的规范一时没有想到,想到了再写,也欢迎大家补充。
如何提高电路工作频率
对于设计者来说,我们当然希望我们设计的电路的工作频率(在这里如无特别说明,工作频率指FPGA片内的工作频率)尽量高。我们也经常听说用资源换速度,用流水的 方式可以提高工作频率,这确实是一个很重要的方法,今天我想进一步去分析该如何提 高电路的工作频率。
我们先来分析下是什么影响了电路的工作频率。
我们电路的工作频率主要与寄存器到寄存器之间的信号传播时延及clock skew有关。在FPGA内部如果时钟走长线的话,clock skew很小,基本上可以忽略, 在这里为了简 单起见,我们只考虑信号的传播时延的因素。
信号的传播时延包括寄存器的开关时延、走线时延、经过组合逻辑的时延(这样划 分或许不是很准确,不过对分析问题来说应该是没有可以的),要提高电路的工作频率,我们就要在这三个时延中做文章,使其尽可能的小。
我们先来看开关时延,这个时延是由器件物理特性决定的,我们没有办法去改变,所以我们只能通过改变走线方式和减少组合逻辑的方法来提高工作频率。1.通过改变走线的方式减少时延。
以altera的器件为例,我们在quartus里面的timing closure floorplan可以看到有 很多条条块块,我们可以将条条块块按行和按列分,每一个条块代表1个LAB,每个LAB里 有8个或者是10个LE。它们的走线时延的关系如下:同一个LAB中(最快)
我们通过给综合器加适当的约束(不可贪心,一般以加5%裕量较为合适,比如电路 工作在100Mhz,则加约束加到105Mhz就可以了,贪心效果反而不好,且极大增加综合时 间)可以将相关的逻辑在布线时尽量布的靠近一点,从而减少走线的时延。(注:约束 的实现不完全是通过改进布局布线方式去提高工作频率,还有其它的改进措施)2.通过减少组合逻辑的减少时延。
上面我们讲了可以通过加约束来提高工作频率,但是我们在做设计之初可万万不可 将提高工作频率的美好愿望寄托在加约束上,我们要通过合理的设计去避免出现大的组 合逻辑,从而提高电路的工作频率,这才能增强设计的可移植性,才可以使得我们的设 计在移植到另一同等速度级别的芯片时还能使用。
我们知道,目前大部分FPGA都基于4输入LUT的,如果一个输出对应的判断条件大于 四输入的话就要由多个LUT级联才能完成,这样就引入一级组合逻辑时延,我们要减少组 合逻辑,无非就是要输入条件尽可能的少,这样就可以级联的LUT更少,从而减少了组 合逻辑引起的时延。
我们平时听说的流水就是一种通过切割大的组合逻辑(在其中插入一级或多级D触发 器,从而使寄存器与寄存器之间的组合逻辑减少)来提高工作频率的方法。比如一个32 位的计数器,该计数器的进位链很长,必然会降低工作频率,我们可以将其分割成4位和 8位的计数,每当4位的计数器计到15后触发一次8位的计数器,这样就实现了计数器的切 割,也提高了工作频率。
在状态机中,一般也要将大的计数器移到状态机外,因为计数器这东西一般是经常 是大于4输入的,如果再和其它条件一起做为状态的跳变判据的话,必然会增加LUT的级 联,从而增大组合逻辑。以一个6输入的计数器为例,我们原希望当计数器计到111100后 状态跳变,现在我们将计数器放到状态机外,当计数器计到111011后产生个enable信号 去触发状态跳变,这样就将组合逻辑减少了。
上面说的都是可以通过流水的方式切割组合逻辑的情况,但是有些情况下我们是很 难去切割组合逻辑的,在这些情况下我们又该怎么做呢?
状态机就是这么一个例子,我们不能通过往状态译码组合逻辑中加入流水。如果我 们的设计中有一个几十个状态的状态机,它的状态译码逻辑将非常之巨大,毫无疑问,这极有可能是设计中的关键路径。那我们该怎么做呢?还是老思路,减少组合逻辑。我 们可以对状态的输出进行分析,对它们进行重新分类,并根据这个重新定义成一组组小 状态机,通过对输入进行选择(case语句)并去触发相应的小状态机,从而实现了将大的 状态机切割成小的状态机。在ATA6的规范中(硬盘的标准),输入的命令大概有20十种,每一个命令又对应很多种状态,如果用一个大的状态机(状态套状态)去做那是不可 想象的,我们可以通过case语句去对命令进行译码,并触发相应的状态机,这样做下来 这一个模块的频率就可以跑得比较高了。
总结:提高工作频率的本质就是要减少寄存器到寄存器的时延,最有效的方法就是 避免出现大的组合逻辑,也就是要尽量去满足四输入的条件,减少LUT级联的数量。我们 可以通过加约束、流水、切割状态的方法提高工作频率。