FPGA学习杂记
for语句在RTL级编码中极少使用,原因是for循环会被综合器展开为所有变量情况的执行语句,每个变量单独占用寄存器资源,不能有效地复用资源,造成巨大的资源浪费。
if……else if……else语句是有优先级的,而case语句是平行的结构。建立优先级结构会消耗大量的组合逻辑,所以能使用case语句的地方尽量用case替代。
同步时序电路
- 电路的核心逻辑用触发器实现;
- 电路的主要信号和输出信号等都是由时钟沿驱动触发器产生的;
- 同步时序电路可以很好地避免毛刺;
- 有利于静态时序分析,验证时序性能;
- 利于器件移植。
稳定可靠的数据采样必须遵从以下两个基本原则:
- 在有效时钟沿到达前,数据输入至少已经稳定了采样寄存器的setup时间之久,这条原则简称满足setup时间原则;
- 在有效时钟沿到达后,数据输入至少还将稳定保持采样寄存器的hold时间之久,这条原则简称满足hold时间原则。
reg型不一定综合成寄存器
- 一般来说,wire型指定的数据和网线通过组合逻辑实现,reg型的定义有可能只是纯组合逻辑。
case(Addr) 2'b00: Dout = Din[1:0]; 2'b01: Dout = Din[3:2]; 2'b10: Dout = Din[5:4]; default: Dout = Din[7:6]; endcase
- 一般来说,wire型指定的数据和网线通过组合逻辑实现,reg型的定义有可能只是纯组合逻辑。
亚稳态
如果触发器的setup和hold时间不满足,就可能产生亚稳态,此时触发器输出端Q在有效时钟沿之后较长一段时间内处于不确定的状态,这段时间内Q端产生毛刺并不断振荡,最终固定在某一电压值。
亚稳态的危害主要体现在破坏系统的稳定性上。毛刺、振荡或固定的某一电压值可能会造成逻辑误判,使状态输出出错。只要系统中有异步元件,亚稳态就无法避免。
模块复用
模块复用or逻辑复制属于速度or面积的问题。简单地从组合逻辑上来说,当时序满足要求的情况下,一般采用模块复用的方式节省面积,相反当时序紧张时,采用逻辑复制的方式提高速度。