你好,
我正在实现SpaceWire I / F(数据/选通编码)的接收器
电路,目标信令速率为200 Mbit / s。
我通过不同的实现变体和约束方法。
我真的很感激每个人都花时间阅读这篇文章并分享他对这件事的看法。
事先,是的,我知道从组合逻辑生成时钟是不好的做法 - 在这种情况下,无论如何,这是编码模式(数据/频闪)的本质......
首先,我实现了最天真的变体 - xor'ing数据和选通输入以获得接收器时钟,通过时钟缓冲器传递此时钟并使用它来采样输入数据(两个时钟边沿):
时钟缓冲器的路由和返回引入 - 与DIN路径相比 - RXCLK路径上的相对延迟。
我尝试了所有三种类型的时钟缓冲器(BUFG,BUFH,BUFR)并调查了时序报告。
我发现太难以满足所需的余量(200 Mbit / s,5 ns位周期)。
据我了解,这是由RXCLK路径上的净路由延迟相对较大的变化(最多3 ns)引起的。
另外,我猜实际时序也受到DIN / SIN引脚和时钟缓冲器之间相对位置的影响。
总而言之,这让我得出结论,这种方法并不令人满意。
然后我偶然发现了一篇描述无竞争条件实现方法实现的论文(参见
http://2010.spacewire-conference.org/proceedings/Papers/Components/Nomachi.pdf)。
所描述的解决方案使用由组合逻辑驱动的S-R锁存器。
我实现了两个变体,产生两个不同的合成结果:
VHDL代码 - 答:
DSeven_P:进程(SpwDIn,SpwSIn,DSeven,DSeven_N)
开始
DSeven
XST警告 - 答:
警告:Xst:2170 - 单位SpwReceiver:以下信号形成组合循环:n0006。
警告:Xst:2170 - 单位SpwReceiver:以下信号形成组合循环:n0014。
VHDL代码 - B:
DSeven_P:进程(SpwDIn,SpwSIn)
开始
如果SpwDIn ='0',SpwSIn ='0'则
DSeven
XST警告 - B:
警告:Xst:737 - 找到信号的1位锁存器。
锁存器可以从不完整的case或if语句生成。
我们不建议在
FPGA / CPLD设计中使用锁存器,因为它们可能会导致时序问题。
警告:Xst:737 - 找到信号的1位锁存器。
锁存器可以从不完整的case或if语句生成。
我们不建议在FPGA / CPLD设计中使用锁存器,因为它们可能会导致时序问题。
我搜索了
论坛,找到了两个相关的主题(
http://forums.xilinx.com/t5/Simulation-and-Verification/Glitches-in-combinational-logic/td-p/133786,
http://forforps.xilinx。
com / t5 / Synthesis / How-to-elimina
tion-Xst-2170-combinatorial-loop / td-p / 180326)这引起了我的注意。
所以,最后我的问题是:
我是否忽略了在Xilinx FPGA中实现数据/选通接收器的一些标准方法,如果是,我在哪里可以找到它?
在任何情况下,LUT都可以安全地描述为无故障吗?
例如。
在任何给定的时间,只有两个输入中的一个可以切换(就像数据/选通编码一样)。
是否有任何额外的无毛刺电路原语(BUFGMUX,ODDR2除外)可能有用吗?
顺便说一下,我用于竞争条件免费变体的约束是:
#XCF:
开始模型“SpwReceiver”
NET“SpwDIn”CLOCK_SIGNAL = YES;
NET“SpwSIn”CLOCK_SIGNAL = YES;
NET“RxClk”CLOCK_SIGNAL = YES;
NET“RxClk”BUFFER_TYPE = BUFH;
结束;
#UCF:
NET“SpW * in”TNM_NET =“TNM_SpWin”;
TIMESPEC“TS_SpWRxClk”= PERIOD“TNM_SpWin”100 MHz HIGH 50%INPUT_JITTER 3650 ps;
NET“SpWDin”OFFSET =在“SpWDin”上升之前的10 ns内有效10 ns;
NET“SpWDin”OFFSET =在“SpWDin”下降之前10 ns有效10 ns;
NET“SpWDin”OFFSET = IN 0 ns有效10 ns“SpWSin”上升之前;
NET“SpWDin”OFFSET = IN 0 ns有效10 ns“SpWSin”下降之前;
我使用的是ISE 14.7,我的设备是XC7K480T-2-FFG901。
谢谢,
弗洛里安