赞
踩
- reg [31:0] cnt1;
- reg [31:0] cnt2;
- always@(posedge clk)
- if(rst)
- cnt1<='d0;
- else
- cnt1<=cnt1+1'b1;
-
- always@(posedge clk)
- if(rst)
- cnt2<='d0;
- else if(enable)
- cnt2<=cnt2+1'b1;
上述代码中,计数器cnt1与时钟clk之间,没有同步信号(指clk从产生以来,cnt1和clk之间没有任何关系),也就是clk上升沿到来的时候,cnt1直接发生变化;计数器cnt2与时钟clk之间,具有同步信号enable,也就是clk上升沿到来的时候,cnt2需要在enable使能拉高后,延时一拍才会发生变化。具体如下面波形图所示。
复位信号拉低后,cnt1在第一个clk上升沿马上发生变化(0-1),没有延时。
复位信号拉低后,cnt2在enable拉高的时候,在下一个时钟上升沿才会发生变化(0-1)。
如果同时出现同步信号cnt和与clk_h无关的信号a,data该如何赋值?
- reg [31:0] cnt;
- always@(posedge clk_h)
- if(rst)
- cnt<='d0;
- else
- cnt<=cnt+1'b1;
-
- reg [3:0] data1;
- reg [3:0] data2;
- always@(posedge clk_h)
- if(rst)
- data1<='d0;
- else if(cnt>=2)
- data1<=a;
- else
- data1<='d0;
-
- always@(posedge clk_h)
- if(rst)
- b<='d0;
- else
- b<=a;
- always@(posedge clk_h)
- if(rst)
- data2<='d0;
- else if(cnt>=2)
- data2<=b;
- else
- data2<='d0;
-
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
当rst拉低后,a从15开始递减,cnt本身也从1开始递增,当cnt>=2的时候,data1开始赋值,由仿真可以看到,data1相对于cnt==2的时候,延时了一拍,满足同步信号延时一拍的规则;但是data赋值与a在同一个周期,而不是与cnt==2时刻对齐的13,这是因为a不是同步信号,也可以理解为a不是在clk_h这个时钟域下进行变化的,所以在下个时钟上升沿的时候,data1赋值12。
同理,data2在cnt==2的时候赋值b,b因为在clk_h时钟域进行了同步,因此,data2赋值b的时候具有同步信号,因此,data2赋值13。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。