微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 关于2倍频同步问题

关于2倍频同步问题

时间:10-02 整理:3721RD 点击:
最近我在调项目里的一个板卡,我用到了xilinx的95144这个cpld,遇到了一个问题,想请教 大家 各位老师。&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;是这样的,cpld从前面的liu中接收到了一个2M的nrz码和与之同步的恢复时钟,现在要用cpld对其nrz-cmi的编码,然后由一位串行输出。而,现在的问题是,我用示波器察看的cmi码会有晃动,周期性的会有错位,我觉得应该是时钟的问题,2M的时钟自然是可以和数据同步上,但是由于要一位串行输出,就需要用一个4M的时钟来提取数据,这个4M(cpld外部16M晶振分频)的时钟就无法和数据同步上了,因此会有误码。我在想,那如何可以得到这个同步的准确的4M时钟呢?cpld内部没有pll,难道要编程实现?好像太麻烦了,况且用硬延迟异或地方法得到的时钟不够精确。这个问题折磨了我好长时间了。 <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 我想问下,大家有什么好的建议么?还是我的思路有问题?<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 希望大家在百忙之中可以帮我解答一下,万分感谢。<br />
<br />
ps:以下是一些核心代码<br />
<br />
process(rclk,RPOS)&nbsp; &nbsp;--rclk是2M恢复时钟<br />
variable flag2: std_logic;<br />
begin<br />
if (rclk'event and rclk='1') then<br />
&nbsp;&nbsp;if RPOS = '1'&nbsp;&nbsp;then<br />
&nbsp; &nbsp;if flag2 = '0' then&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;--如果flag2为'0',则输"00",flag2为'1' <br />
&nbsp; &nbsp;&nbsp; &nbsp; Dataout &lt;= "00";<br />
&nbsp; &nbsp;&nbsp; &nbsp; flag2 := '1';<br />
&nbsp; &nbsp; else&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;--否则如果flag2为'1',则输出"11",同时置flag2为'0'<br />
&nbsp; &nbsp;&nbsp; &nbsp; Dataout &lt;= "11";<br />
&nbsp; &nbsp;&nbsp; &nbsp; flag2:= '0'; <br />
&nbsp; &nbsp; end if;<br />
&nbsp; &nbsp;else&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;--其它:"01"<br />
&nbsp; &nbsp;&nbsp; &nbsp;Dataout &lt;= "01";&nbsp; &nbsp; <br />
&nbsp;&nbsp;end if;<br />
end if;<br />
end process;<br />
process(clk4,Dataout,sign)&nbsp;&nbsp;-- clk4是cpld外部16M晶振分频<br />
variable flag3 : std_logic;<br />
begin<br />
if (clk4'event and clk4='1')then<br />
&nbsp; &nbsp;if flag3 = '0' then<br />
&nbsp; &nbsp;&nbsp; &nbsp;T_DATA &lt;= Dataout(0);<br />
&nbsp;&nbsp;flag3 := '1'; <br />
&nbsp;&nbsp;else<br />
&nbsp; &nbsp; T_DATA &lt;= Dataout(1);<br />
&nbsp;&nbsp;flag3 := '0';<br />
&nbsp; &nbsp; end if;<br />
&nbsp;&nbsp;end if;<br />
end process;

我想我不是很明白你的具体运用的设计是什么原理,不知道回答你是否合适。但是还是给点自己的考虑吧,如果有些用处将非常高兴,如果没有用处的话也请原谅。
我先大概的总结一下你的问题:外部输入两个信号,同步的时钟和数据;
希望对其做一个数码的转换运算,就是你称其为nrz-cmi的编码;
最后,你发现输出的cim码有错,并且是周期性的错误?

是这样的吗?

代码看起来很费劲,你其实应该花更多的时间来阐述一下你的问题,然后从思路上解决问题。最后的代码实现就容易多了。
这样你看好不好,你把你想实现的输入和输出的关系,并且相关的时序大概描述一下,也许这样能够帮你想到方法的人会更多。

从我以往的设计来看,时序电路出现问题很多时候,不仅仅是你代码的问题,还会和你的PCB走线等外部原因有关系的...当然,设计的好的时序可以给外部电路更多的冗余,保证后续的测试觉得它不会出错。

具体问题
很很很谢谢楼上的,我最近一直在被这个东西折磨。
我可能说的不是很清楚,我整理了一下思路。
是这样的:   
                    输入:   2M的NRZ数据(RPOS),2M的数据的同步时钟(RCLK).
cpld需要进行的处理:   把NRZ码进行转换到CMI码,然后从一个管脚输出。
                    问题:   可以用2M的RCLK来对NRZ数据进行1位变2位的码型转换,变成4M的数据,现在要用一个同步的4M时钟来同步串行发送这个CMI码,这个4M的时钟想用CPLD来实现,
                                不知道该如何操作?没有思路。

                    想法:    我想可以用晶振的16M时钟来同步这个2M的RCLK,产生2M的信号时钟,但是又该如何产生同样同步的4M时钟呢?总不能用95144来实现一个PLL吧?太复杂况且
                                 很可能95144的资源也不够啊?


                         万分急迫,万分谢谢。

                         希望大家提些思路啊。

是不是有4B/5B转换没有做呀?

:time: :time: :time: :time:

关于时钟
怎么会有4B/5B转换的问题呢?我这个应该是1B/2B的转换啊。

继续等待。

我先大体说一下我的思路,不对之处敬请指正。
首先分频16MHz的晶振得到2M和4M的输入和输出时钟。由于你要把1b转换为2b那么在输入和输出之间可以使用一个fifo来实现。即实际是使用fifo来同步你的输入输出时钟。

NRZ编码应该有4B/5B的问题呀,CMI编码我不熟悉。

等待
是不是用cpld不可能实现倍频?
是不是该考虑用专门的pll芯片?

顶。ddd

你不需要外面的2M时钟,也不需要fifo,你只需要16M时钟和2m数据就可以了。你用16M时钟提取2m时钟,提取过程中自然会产生4M时钟,你用恢复出来的2m和4m时钟作NRZ-CMI转换就可以了。嘻嘻,思路要活,其实CMI-NRZ解码的时候才有小技巧呢

呵呵
我觉得小编遇到的是一个时钟之间相位差的问题。用16M时钟生成2M,4M的时钟都不难,但是一定要保证这生成的两个时钟与输入数据的参考时钟有确定的相位关系,否则数据采集就会出错。怎样保证相位关系呢?我想应该是用DPLL吧.
说错的地方请别见笑哈各位。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top