初级会员
- 积分
- 121
- 金钱
- 121
- 注册时间
- 2019-5-23
- 在线时间
- 44 小时
|
1金钱
我在FPGA内部通过PLL生成500M的时钟用来对数据进行处理,很简单的代码如下。
但是入口数据和出口数据不一样,一直找不到原因,经过时序约束,依旧存在误码的情况,求解答
//************************************************
//File name: data_inout
//Descriptions:将12位数据拼接成16位数据
//************************************************
module data_inout(
input PLL_500M,
input rst_n,
input [11:0] AD_in0,
output reg [15:0] AD_out0,
output reg [1:0] cnt_clk,
input over_3us
);
reg [11:0] q0_data0;
always@(posedge PLL_500M or negedge rst_n)
begin
if(!rst_n)
begin
q0_data0<=12'h000;
AD_out0<=16'h0000;
cnt_clk<=2'b00;
end
else if(over_3us==1)
begin
cnt_clk<=cnt_clk+1'b1;
if(cnt_clk==0)
begin
q0_data0<=AD_in0;//输入数值先寄存过去
end
else if(cnt_clk==1)//可以输出data0
begin
AD_out0<={q0_data0,AD_in0[11:8]};//拼凑第一个数值
q0_data0<=AD_in0;//再寄存
end
else if(cnt_clk==2)
begin
q0_data0<=AD_in0;//再寄存
AD_out0<={q0_data0[7:0],AD_in0[11:4]};//拼凑第二个数值
end
else if(cnt_clk==3)
begin
AD_out0<={q0_data0[3:0],AD_in0};//拼凑第三个数值
end
end
else if(over_3us==0)
cnt_clk<=0;
end
endmodule
以下是在线逻辑分析仪抓取的数据:
逻辑分析仪抓取数据
我使用500M时钟固定生成:AB0、123、456、789这样的16进制数据循环;
在数据处理后正确的数据应该是0123、4567、89AB这样的16进制循环,
可是数据出现了0123、4567、89EB这样的误码。令人百思不得其解
|
最佳答案
查看完整内容[请看2#楼]
误码的问题搞定了。
1、首先我的程序有用到PLL时钟功能,不可避免的就有两个复位信号(外部复位、PLL稳定复位);
2、上面列出的部分程序就是使用了外部的复位信号所以出现误码的情况,至于根本原因不了解。有知道的可以给出答案。(此处说明一点不单单使用内部PLL产生的500M会误码,芯片外部进入的500M也会误码)
3、500M速率的数据进入RAM,以50M速率出来的数据也会出现误码的原因是输出的数据没有加时钟同步,如下图:
|