打印
[matlab]

xilinx中是不是没有用于位同步的数字锁相环IP核

[复制链接]
3748|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
izefei|  楼主 | 2011-8-29 20:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
SuperX-man| | 2011-8-29 21:35 | 只看该作者
没有那么复杂.直接计数分频就可以了,不用PLL吧官网有不少Uart的参考设计.

使用特权

评论回复
板凳
jakfens| | 2011-8-30 08:30 | 只看该作者
有没有牛人写写这个testbench??


module UART(rxd,clock,out,end_flag);
input clock; //????
input rxd; //??
output[7:0] out; //????8???
output end_flag;
reg[7:0] out;
reg end_flag;
reg recclk;//16??9600???
reg[8:0]divcnt;//????
reg[9:0]data_buf; //??????
reg[3:0]cnt;
reg[3:0]bitpos; //???????
reg[7:0]sbuf;
reg[1:0]state;

//-------------------------------------------------------------------------//

parameter st0=2'b00, //?????
          st1=2'b01,
          st2=2'b11;
// st3=2'b10;

//-------------------------------------------------------------------------//

always@(posedge clock) //????325? ??9600 16????
begin //????162? ??19200 16????
if(divcnt<9'd162)
begin
divcnt=divcnt+1'b1;
recclk=1'b0;
end
else
begin
divcnt=1'b0;
recclk=1'b1;
end
end

//-------------------------------------------------------------------------//


always@(posedge recclk)//16??9600???
begin
case(state)
  
st0:begin
// end_flag=1'b1;
      end_flag=1'b0;
     if(rxd==1'b1)
       begin
        cnt=4'h0;
        state=st0;//??????
       end
    else
       begin
        cnt=cnt+1'b1;
       end
    if(cnt==4'h2)
       begin
        state=st1;
        cnt=4'h0;
        bitpos=0;
      end
     end
     
//--------------------//  
   
st1:begin
if(cnt==4'hf)
begin
cnt=4'h0;
data_buf[bitpos]=rxd;
bitpos=bitpos+1'b1;
if(bitpos==4'd9)//9???
begin
bitpos=4'd0;
state=st2;
end
end
else
begin
cnt=cnt+1'b1;
end
end

//---------------------//

st2:begin//????????
// end_flag=1'b0; //??
end_flag=1'b01;//??????????
sbuf=data_buf[7:0];
out=sbuf;
state=st0;
end
default:state=st0;
endcase
end
endmodule

使用特权

评论回复
地板
SuperX-man| | 2011-8-30 08:33 | 只看该作者
直接上板子用串口调试工具看...9600看仿真..那得等多久阿

使用特权

评论回复
5
jakfens| | 2011-8-30 08:39 | 只看该作者
:D 具体在板子上如何调试 testbench太麻烦了 4# SuperX-man

使用特权

评论回复
6
izefei|  楼主 | 2011-8-30 09:11 | 只看该作者
我一开始确是是直接计数分频的,结果也对。
但是突然想到PC机通过UART发送数据的时钟和PC机本身时钟是一致的,而电路板接收数据时利用的上电路板上的晶振时钟,直接计数分频的话,能够保证相位一致吗。
2# SuperX-man

使用特权

评论回复
7
atua| | 2011-8-30 09:21 | 只看该作者
16倍时钟采样

使用特权

评论回复
8
dan_xb| | 2011-8-30 13:04 | 只看该作者
FPGA是高级货,不要沿用74系列那种老办法。
去网上搜一下UART的例子,或者随便找本书。
UART这种极慢的东西,哪还用得到CDR啊
都是过采样,然后判断边沿的。

使用特权

评论回复
9
wahahaabc| | 2011-8-30 21:10 | 只看该作者
7楼 8楼正解

使用特权

评论回复
10
ooljo| | 2011-8-31 06:46 | 只看该作者
UART的例子网上有很多

使用特权

评论回复
11
ooljo| | 2011-8-31 06:46 | 只看该作者
:)

使用特权

评论回复
12
emesjx| | 2011-9-5 22:16 | 只看该作者
UART由于有起始位和停止位,可以很方便的做到字节同步,因此不需要PLL那样复杂的东东去同步,只要接收与发送的波特率一样就可以了,用16倍波特率的时钟采样起始位的下降沿就可以做到位同步(相位同步),即使波特率或相位有点误差,在波特率不是很高的情况下,其累计误差在一个字节内不超过1比特就不会出错的。其实Xilinx FPGA的DCM内部就有PLL的,使用反馈时钟(同步信号)与输入时钟(被同步信号)就构成一个PLL,输出就是被锁相的了。只是一般情况下将DCM做分频器、倍频器使用时,反馈信号是选择(内部)直接连接到输出的,以保证输入、输出同相(0延时)。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

80

帖子

1

粉丝