在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 5277|回复: 11

关于2倍频同步问题

[复制链接]
发表于 2007-11-22 14:41:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
最近我在调项目里的一个板卡,我用到了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;

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

是这样的吗?

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

从我以往的设计来看,时序电路出现问题很多时候,不仅仅是你代码的问题,还会和你的PCB走线等外部原因有关系的...当然,设计的好的时序可以给外部电路更多的冗余,保证后续的测试觉得它不会出错。
 楼主| 发表于 2007-11-22 17:10:53 | 显示全部楼层

具体问题

很很很谢谢楼上的,我最近一直在被这个东西折磨。
我可能说的不是很清楚,我整理了一下思路。
是这样的:   
                    输入:   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的资源也不够啊?


                         万分急迫,万分谢谢。。。。。。

                         希望大家提些思路啊。。。。。。
发表于 2007-11-22 18:16:18 | 显示全部楼层
是不是有4B/5B转换没有做呀?
发表于 2007-11-22 19:36:46 | 显示全部楼层
:time: :time: :time: :time:
 楼主| 发表于 2007-11-23 11:08:19 | 显示全部楼层

关于时钟

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

继续等待。。。。。。。。。
发表于 2007-11-23 12:30:54 | 显示全部楼层
我先大体说一下我的思路,不对之处敬请指正。
首先分频16MHz的晶振得到2M和4M的输入和输出时钟。由于你要把1b转换为2b那么在输入和输出之间可以使用一个fifo来实现。即实际是使用fifo来同步你的输入输出时钟。
发表于 2007-11-23 17:12:53 | 显示全部楼层
NRZ编码应该有4B/5B的问题呀,CMI编码我不熟悉。
 楼主| 发表于 2007-11-27 10:36:58 | 显示全部楼层

等待

是不是用cpld不可能实现倍频?
是不是该考虑用专门的pll芯片?
 楼主| 发表于 2007-11-29 20:10:46 | 显示全部楼层
顶。。ddd
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-16 08:13 , Processed in 0.023942 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表