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