<数字信号处理的FPGA实现>Verilog写状态机大概有这样几点要求:1、组合逻辑完成状态转移的条件判断,时序逻辑完成状态机的状态转移。
2、组合逻辑和时序逻辑分别在两个不同的always块中完成,根据状态机状态通过译码逻辑产生的与状态机无关的逻辑部分不要放在专用的状态机always块中。
3、状态编码预先定义为parameter,状态较少的状态机推荐使用one-hot方式编码,以减小译码逻辑的复杂度,提高性能。
4、建议单独使用一个模块来描述状态机。
5、状态机应有一个default状态,在上电复位的时候作为初始状态。
6、注意状态机组合逻辑中的if...else语句,不要出现latch。
7、对于复杂状态机,最好采用状态机嵌套方式完成。
其实上面很多都是按照Synopsys LEDA的coding style的要求的,状态机的写法相对固定,因此很多Design entry的工具可以自动生成状态机代码,Xilinx也有工具支持直接由状态转移图输入完成状态机的编码。
所以关键还是画好状态转移图,其他就相对简单了。
visual hdl+ISE+synplify Pro+modelsim!1.设计输入1)设计的行为或结构描述。
2)典型文本输入工具有UltraEdit-32和Editplus.exe.。
3)典型图形化输入工具-Mentor的Renoir。
4)我认为UltraEdit-32最佳。
2.代码调试1)对设计输入的文件做代码调试,语法检查。
2)典型工具为Debussy。
3.前仿真1)功能仿真2)验证逻辑模型(没有使用时间延迟)。
3)典型工具有Mentor公司的ModelSim、Synopsys公司的VCS和VSS、Aldec公司的Active、Cadense公司的NC。
4)我认为做功能仿真Synopsys公司的VCS和VSS速度最快,并且调试器最好用,Mentor 公司的ModelSim对于读写文件速度最快,波形窗口比较好用。
4.综合1)把设计翻译成原始的目标工艺2)最优化3)合适的面积要求和性能要求4)典型工具有Mentor公司的LeonardoSpectrum、Synopsys公司的DC、Synplicity公司的Synplify。
5)推荐初学者使用Mentor公司的LeonardoSpectrum,由于它在只作简单约束综合后的速度和面积最优,如果你对综合工具比较了解,可以使用Synplicity公司的Synplify。
5.布局和布线1)映射设计到目标工艺里指定位置2)指定的布线资源应被使用3)由于PLD市场目前只剩下Altera,Xilinx,Lattice,Actel,QuickLogic,Atmel六家公司,其中前5家为专业PLD公司,并且前3家几乎占有了90%的市场份额,而我们一般使用Altera,Xilinx公司的PLD居多,所以典型布局和布线的工具为Altera公司的Quartus II和Maxplus II、Xilinx公司的ISE和Foudation。
4)Maxplus II和Foudation分别为Altera公司和Xilinx公司的第一代产品,所以布局布线一般使用Quartus II和ISE。
6.后仿真1)时序仿真2)验证设计一旦编程或配置将能在目标工艺里工作(使用时间延迟)。
3)所用工具同前仿真所用软件。
7.时序分析4)一般借助布局布线工具自带的时序分析工具,也可以使用Synopsys公司的PrimeTime软件和Mentor Graphics公司的Tau timing analysis软件。
8.验证合乎性能规范1)验证合乎性能规范,如果不满足,回到第一步。
9.版图设计1)验证版版图设计。
2)在板编程和测试器件。
FPGA to ASIC有很多问题都要重新考虑。
随便举几个例子:1。
时钟设计:FPGA一般使用全局时钟资源,严格避免使用门控时钟。
而ASIC考虑到功耗等因素,应该建立时钟树结构。
2。
RAM,FIFO等基本模块;FPGA设计一般用vendor提供的IP,认为vendor的IP的效率、稳定性、健壮性都很好。
但是ASCI中除非你购买,一般是没有免费的RAM,FIFO等IP,自己用HDL语言描述,要考虑很多问题,比如bist等,要对RAM的健壮性等加以测试,保障。
3。
同步时序设计:FPGA提倡使用全同步时序设计,因为FPGA的基本可编程单元都是由固定比例的FF和4-LUT构成的。
而ASCI一切都是用逻辑门实现的,一个D触发器大概要消耗7个门左右(最少),而一个与非门用一个逻辑门就够了,所以大量使用FF,会造成规模的大幅度膨胀。
所以ASCI经常要使用大面积的组合逻辑。
4。
实现约束和设计思想,由于3所述的原因,ASIC与FPGA在时序约束和设计思想上都有很大的差异。
以前由于工作的需要,花了一些时间看了加法器设计方面的资料,当时就想稍为整理一下,只是太忙顾不上。
前几天有网友想讨论一下加法器的设计问题,我觉得讨论最好有个基础,于是整理出《加法器介绍》一文,希望起到抛砖引玉的作用,请大家批评指正。
加法器设计介绍(1)随着大规模、高速度FPGA的广泛应用,基于FPGA的定制DSP应用日渐普遍,与传统DSP 处理方法相比较具有更高的速度、设计灵活、易于更改等优点。
常常应用于对设计方案和关键算法的验证。
定制DSP应用使设计者可以为特定的设计提供最佳的实现方案并缩短了开发周期与成本。
在DSP运算中,加法是最常用的,如何设计好加法器是FPGA/ASIC设计的一个重要问题。
加法器的种类非常多,根据加数个数的不同,可以分为两个加数的加法器和多个加数的加法器;根据进位的处理方式不同,可以分为进位传播加法器、进位保存加法器等,其中进位传播加法器又有很多不同的实现方式,例如行波进位加法器、超前进位加法器、carry-skip加法器、carry-select加法器等,各种加法器之间的关系入图1所示。
图1把加法器分为1-bit加法器、进位传播加法器(Carry-propagate adders)、进位保存加法器(Carry-save adders)和多操作数加法器(multi-operand adders)等4大类。
其中1-bit加法器完成两个位宽为1比特的操作数相加,包括半加器(HA,Half Adder)、全加器(FA,Full Adder)等类型。
进位传播加法器的种类比较多,有行波进位加法器(RCA,ripple-carry adder)、进位skip加法器(CSKA,carry-skip adder)、进位选择加法器(CSKA,carry-select adder)、进位递增加法器(CIA,carry-increment adder)、超前进位加法器(CLA,carry-lookahead adder)、并行前缀加法器(PPA,parallel-prefix adder)、条件累加加法器(COSA, conditional-sum adder)等,这样划分的根据是进位的处理方法不同。
众所周知,加法器的关键路径在进位链上,例如为了实现一个32比特的加法器,如果不考虑来自低位的进位,那么可以用32个1-bit加法器,把两个操作数按位相加,经过1-bit加法器的延迟就可以得到加法的结果,这样的“加法器”面积小、速度快。
但是实际情况却不是那么理想,高位的结果和低位的进位是密切相关的,因此在得到低位的进位之前,高位无法输出相加结果,也就是说第1位进位产生后,才能产生结果的第2比特和进位,然后产生第3比特的结果和进位,如此类推,可见,需要很长时间才能得到第32位的结果和进位。
在这个过程中,由于进位传播的存在严重影响了加法器的速度,为了解决这个问题,人们设计了多种不同的进位传播方式,希望减小关键路径的长度,相应地产生了很多中不同地进位传播加法器。
进位保存加法器(CSA)是一种特殊的加法器,它把进位作为加法的输出结果,而不作为中间结果并传递到高位去,从而避免了进位的传播过程。
例如使用CSA实现10110+00111时,相加的结果包括两个部分,一是不考虑进位的按位相加结果10001,第二部分是进位00110,最终的结果是把这两个部分加起来,即10001+(00110<<1),但是把“两个部分加起来”这个操作不是CSA的一部分。
CSA加法器由3个输入(即两个操作数和1个进位输入),或者2个输入(只有两个操作数,没有进位输入)。
CSA可以用多个全加器实现,CSA的延迟是个常数,与操作数的位数无关,这是一个很重要的特点。
多操作数加法器(multi-operand adders)完成3个或以上操作数的相加,包括阵列加法器和树状加法树等,其中阵列加法器一般用CSA实现,CSA做多操作数的加法具有很大的优势。
下次进一步介绍各种加法器的特点、结构和实现方法。
亚稳态与设计可靠性设计数字电路时大家都知道同步是非常重要的,特别当要输入一个信号到一个同步电路中,但是该信号由另一个时钟驱动时,这是要在接口处采取一些措施,使输入的异步信号同步化,否则电路将无法正常工作,因为输入端很可能出现亚稳态(Metastability),导致采样错误。
这里我们对亚稳态的起因、危害、对可靠性的影响和消除仿真做一些介绍。
1.亚稳态发生的原因在同步系统中,如果触发器的setup time / hold time不满足,就可能产生亚稳态,此时触发器输出端Q在有效时钟沿之后比较长的一段时间处于不确定的状态,在这段时间里Q端毛刺、振荡、固定的某一电压值,而不是等于数据输入端D的值。
这段之间成为决断时间(resolution time)。
经过resolution time之后Q端将稳定到0或1上,但是究竟是0还是1,这是随机的,与输入没有必然的关系。
2.亚稳态的危害由于输出在稳定下来之前可能是毛刺、振荡、固定的某一电压值,因此亚稳态除了导致逻辑误判之外,输出0~1之间的中间电压值还会使下一级产生亚稳态(即导致亚稳态的传播)。
逻辑误判有可能通过电路的特殊设计减轻危害(如异步FIFO中Gray码计数器的作用),而亚稳态的传播则扩大了故障面,难以处理。
3.亚稳态的解决办法只要系统中有异步元件,亚稳态就是无法避免的,因此设计的电路首先要减少亚稳态导致错误的发生,其次要使系统对产生的错误不敏感。
前者要靠同步来实现,而后者根据不同的设计应用有不同的处理办法。
用同步来减少亚稳态发生机会的典型电路如图1所示。
在图1中,左边为异步输入端,经过两级触发器同步,在右边的输出将是同步的,而且该输出基本不存在亚稳态。
其原理是即使第一个触发器的输出端存在亚稳态,经过一个CLK 周期后,第二个触发器D端的电平仍未稳定的概率非常小,因此第二个触发器Q端基本不会产生亚稳态。