PLL复位问题
0赞这些天在学习sdram控制器代码的编写,现在常规的读写功能都已经很好地实现了,接下来开始DDR2了。在sdram前仿都是很顺利的,后仿的时候出了一些问题费了一点劲才弄明白,其中有一个是PLL复位的问题。现在把SDRAM里面的PLL单独拿出来对它进行一次测试。
首先利用Mega Wizard Plug配置一个pll,如下图所示转为原理图,我的本意是经过PLL分频以后得到sdram控制器和sdram需要的两个100M时钟,其中sdram时钟相位设置180度,lock信号用作复位信号。

然后我写testbench给如下激励信号Initial begin inclk0=0; areset=0; #40 areset=1; endalways # 10 inclk0=~inclk0; 因为我习惯上用低电平复位,看过的代码以多用低电平复位,所以一开始就给低电平复位信号。仿真波形如下所示,我们可可以看到PLL输出实际上是高电平复位有效。(很多时候我们不了解altera免费提供的IP模块的功能,完全可以采用这样对它进行仿真的方式,查看仿真波形了解它的具体功能,之前学习FIFO,RAM的时候我都这样做过。)

然后我改测试代码Initial begin inclk0=0; areset=1; #40 areset=0; end,得到波形如下,这样才得到了我们所要的经过PLL分频后的时钟,时钟有效之后,locked也开始拉高,所以我们可以把输出的locked信号作为我们所设计的系统的复位信号。

同时我们看这里的波形,它实际是由很大的问题的,在我们把locked信号作为全局复位信号时,在一段时间里面时钟信号时不稳定的,就是说PLL分频以后输出的时钟它是需要一个过程才能稳定下来,在这段时间里,我们输出的复位信号也是不稳定的,开始我的SDRAM里正是采用了这个不稳定的复位信号,出现了不正确的波形。到先在我翻开特权同学的《深入浅出玩转FPGA》P47,他在这里谈到了这个问题,但是之前我因为不了解PLL的具体输入输出波形,所以一直不理解他为什么要做那样一个动作。特权同学在书里写的很多东西非常有用,针对一些问题提出了一些很好的解决措施,但是若果你都不了解为什么会出现那样的问题,什么时侯会出现那样的问题,估计看起来也很非经,看得不知其所以然。
他在这里是把前级复位信号ARESET和这里生成的locked信号进行相与以后再输出给后面的系统复位信号,当然他这里为了得到更稳定可靠的复位信号,前后级的复位信号都用异步复位同步释放处理了。。
我这里采用的方法是对locked信号进行了一下延迟处理,加了一个小模块进来,代码和原理图及现在的仿真波形如下:
module reset(clk,lock,reset_n);
input clk,lock;
output reg reset_n;
reg [2:0]count;
always@(posedge clk or negedge lock)
if(~lock)
begin
reset_n<=0;
count<=0;
end
else if(count==5) reset_n<=1;
else count<=count+1;
endmodule


我们看到现在两个输出时钟C0,C1稳定以后,locked信号才开始拉高复位。在需要的时候我们同样可以在前级arese和后面reset_nd都加上异步复位同步释放的处理方法,只是在小练习里面一般不会引起太大的问题,这里省略了。可是在很多工程里面越是这些小问题,越有值得细细考究的价值。
另注:其实在向导里面可以直接设置locked信号输出延迟多少拍,跟上面的效果是一样的,就不必要麻烦了。这样写一下的话理解得会更深刻。
异步复位同步释放的处理:仿真后我们看到不加处理的复位信号是跟时钟信号是不对齐的,经过同步释放处理以后的信号时跟时钟沿对齐的,
module reset(clk, rst_n, reset_n);
input clk;
input rst_n;
output reg reset_n;
reg reset;
always@(posedge clk or negedge rst_n)
if(~rst_n)
begin
reset<=0;
reset_n<=0;
end
else
begin
reset<=1;
reset_n<=reset;
end
endmodule


在FPGA设计中,复位电路是及其重要的,因为一个不正确设计的复位本身可以表现为一个不可重复的逻辑错误.复位电路分为:异步复位和同步复位.
异步复位:无论时钟沿是否到来,只要复位信号有效,就对系统进行复位.
优点:1.节省资源(大多数器件的dff都有异步复位端口, 因此采用异步复位可以节省资源)
2.设计相对简单。
3.异步复位信号识别方便,而且可以很方便的使用FPGA的全局复位端口GSR
缺点:
1.在复位信号释放的时候容易出现问题。具体就是说:倘若复位释放时恰恰在时钟有效沿附近,就很容易使寄存器输出出现亚稳态,从而导致亚稳态。
2.复位信号容易受到毛刺的影响.
同步复位:复位信号在时钟沿到来的时候,才能有效,否则,不复位.
优点:1. 便于系统同步化(同步复位可以使你的系统成为完全的同步时序电路,便于时序分析,而 fmax一般较高)
2.便于滤除高频毛刺(他采用clk打一拍可以消除高频毛刺)
缺点:1. 复位信号的有效时要大于时钟周期,才能真正被系统识别并完成复位任务。同时还要考虑,诸如:clk skew,组合逻辑路径延时,复位延时等因素
2. 浪费资源(由于大多数的逻辑器件的目标库内的DFF都只有异步复位端口,所以,倘若采用同步复位的话,综合器就会在寄存器的数据输入端口插入组合逻辑,这样就会耗费较多的逻辑资源)
FPGA设计中复位的处理方法(工程中常用)
异步复位,同步释放 + 复位信号低电平有效
异步复位,同步释放 : 就是在复位信号到来的时候不受时钟信号的同步,而是在复位信号释放的时候受到时钟信号的同步。
现场操作:编写异步复位电路和同步复位电路用quartusII软件中的RTL Viewer查看电路.
