请网上的VERILOG大神帮我看看这段代码,在ALWAYS语句块启动条件中去掉or...

发布网友 发布时间:2024-10-23 16:43

我来回答

1个回答

热心网友 时间:2024-11-06 08:22

always @(posedge CLK1 or posedge CLK3)

这样写的话,clk1的上升沿到来时或者clk3的上升沿到来时都会激活下面的语句

如果不看后面的语句,那么主要有三种情况会激活语句:
1、CLK1的上升沿先到,然后到CLK3的上升沿到
2、CLK3的上升沿先到,然后到CLK1的上升沿到
3、两个上升沿同时到达

然后你的
if(CLK1)

这条语句则限定了语句在上述3种情况下,
1、当CLK1的上升沿到达,CLK3的上升沿没有到达时,SECONDS会+1;
下面如果CLK3的上升沿到达,此时若

1.1 CLK1还是保持1的状态,则语句会被重新激活,SECONDS还会再+1
1.2 CLK1已经回到了0的状态,则语句不会被激活

2、CLK3的上升沿先到,然后到CLK1的上升沿未到时,语句不会被激活,SECONDS不变
下面如果CLK1的上升沿到达,此时若
2.1 CLK3还是保持1的状态,,则语句会被激活,SECONDS会+1;
2.2 CLK3已经回到了0的状态,则语句会被激活,SECONDS会+1;
意思就是第二种情况来说,CLK3的状态没有对SECONDS有影响,还是由CLK1决定

3、同时到达的情况,则SECONDS会+1;概率很低,实际上会产生竞争冒险

我认为你的输出有问题应该出在情况1处,你的SECONDS应该是在不应该+1的时候+1了吧?

一般一个always模块里面只设置一个时钟信号,不然分析起来很麻烦。绝绝绝大部分情况不会这么写的,只是你既然上知道问了,我就帮你分析一下而已。这个模块你还是重新写吧

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com