1,时序逻辑赋值基础
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)。
2,时序逻辑赋值进阶
如果同时出现同步信号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;
当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。