| |
前些天参加了一次Xilinx-FPGA的培训,对FPGA和Xilinx的ISE软件有了些初步的认识,了解了如何由算法映射到FPGA。
数字电路基本上可以分为组合逻辑电路(通过真值表来表示)和时序逻辑电路(通过时序图来表示)。通过同步时钟控制的寄存器(register)来存储中间结果,可以实现同步电路,所以RTL(register transfer level)级的设计在FPGA设计中扮演着重要的角色。
FPGA设计首先要了解所采用的FPGA器件的特性。Xilinx-FPGA的基本资源包括可配置逻辑块(CLB: configurable logic block), 输入/输出块(I/O blocks), 块RAM, 时钟控制等。不同器件中基本模块(CLB, I/O block, block RAM)的个数以及时钟控制的复杂度不同,可由数据手册查得。
依同步寄存器(也被称为同步器件)为基准,FPGA设计中路径可以分为四类: 输入口到同步器件, 同步器件到同步器件, 同步器件到输出口,输入口到输出口。
Xilinx-ISE 9.2i 版在Xilinx网站有免费版下载(http://www.xilinx.com/ise/logic_design_prod/webpack.htm), 可以完成由综合(Synthesize),翻译(translate),映射(Map),布线(Place and route),及FPGA编程(Programming)各个步骤。对於像我这样的初学者,比较容易理解。
以周期为2^17-1的两个伪随机序列的产生器为例(http://direct.xilinx.com/bvdocs/appnotes/xapp211.pdf),采用Spartan 3的 C3S200器件,综合后可以通过"View Technology Schematic" 得到如下的框图,其中用到的器件有查找表(LUT), 2选1的多选器(MUX) 以及带有使能端的D-型寄存器(FDE)。此外,LUT还可用来做多位移位寄存器(SRL16E表示带有使能,最多16位的移位寄存器) 。LUT,MUX和FDE都包含在FPGA的CLB中。
框图的输入有五个信号: 时钟clk,两个PN序列产生器初始化数据DataIn_i和DataIn_q,反馈信号使能FillSel(FillSel决定输入寄存器的是初始化数据还是反馈数据)和移位使能ShiftEn。
输出的是产生的两路PN序列pn_out_i和pn_out_q。
对设计进行实现后(Implement Design),可以在Place and Route下检查步线后的设计。下面以I-路PN序列为例,其生成多项式为x^17+x^5+1。17位移位寄存器中的比特定义为srl_i<0>, srl_i<1>, ..., srl_i<16>,其中srl_i<0>作为最终输出序列。下面是I-路PN序列的步线后的实现电路,包括两部分(电路中绿线为实现的路径)。
第一部分包括初始化数据选择和反馈数据的产生,定义lfsr_in_i为线性反馈移位寄存器(PN序列产生器)的输入,则lfsr_in_i = FillSel ? Data_in_i : (srl_i<5> ^ srl_i<0>),即通过反馈信号使能FillSel来决定输入的是初始化数据还是反馈数据。而lfsr_in_i可由4输入的组合逻辑实现,即lfsr_in_i = (FillSel AND Data_in_i) OR ((NOT FillSel) AND (srl_i<5> XOR srl_i<0>)),所以lfsr_in_i可由一个LUT来实现。通过一个FDE即可得到srl_i<16>。对於Spartan 3,两个Slice对应一个CLB,而每个Slice又包含两个LUT,如下电路即是一个Slice。
第二部分则是由srl_i<16>信号通过移位寄存器来得到srl_i<5>和srl_i<0>信号,用于反馈数据的产生。实现电路如下:
在电路的下半部分,通过LUT和FDE来实现移位寄存器,由srl_i<16>产生srl_i<5>信号。而srl_i<5>又在上半部分被利用来产生srl_i<0>。这一部分也对应一个CLB。
最终FPGA的步线如下所示,两路PN序列产生器由两个CLB来实现。