关于时序逻辑赋值是否延拍的问题

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。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值