请大家看一下这种代码会有什么样的风险?
always @ (posedge clk or negedge rst_n)
begin
if (!rst_n)
begin
a <= 'b0;
end
else if (flag)
begin
a <= a + 1'b1;
end
else
begin
a <= a;
end
end
不明白会出现什么样的风险,请各位大神前辈知无不言言无不尽,都说说这种计数器写法存在的问题,如何能改进,谢谢!
感觉没什么问题。看代码审查会给什么意见吧!
我看也没什么问题啊。
谢谢,我也是实在看不出什么问题, 以前在上家单位的时候基本会用到很多这样的写法,都没有问题的。
谢谢,我也觉得没啥问题,领导说else分支的赋值是把输出接到输入上了。
那是组合逻辑环,你这个是时序电路
谢谢,我也知道组合逻辑环是不可以,时序逻辑我也没听说这样有什么不可以~只以为自己孤陋寡闻了~而且以前都这样写也一直没问题。
应该正如你说的产生了反馈应该多少会影响,建议你再看看反馈是什么回事吧
这样应该没有设么问题的
最后一个else可以不写,不过写上去可读性更直观。
综合后,效率是一样的。
- <= #`DLY
没问题的,别瞎想了。
建议用原代码问那个领导。贴出来的没问题。
也就是说这种计数器本质上是锁存对么?
好!不纠结了~哈哈~
Good idea!
组合逻辑这么写会出现组合逻辑回环的warning,时序逻辑写不写这句综合结果是一样的,小编可以自己试验下,这么写我觉得应该是没问题的,不管是FPGA还是ASIC,至少没人说我这么写得有问题。
没问题,最标准的写法
明显你老大一知半解,以为环路出现在组合逻辑有风险,时序逻辑也有风险
你写的是取反操作吗?1bit不用加吧,或者你可以把你的代码贴准确点。
或者你这个是时钟分频,分频的话是通过flag作门控吗?
还是贴个准确的吧
a的位宽是多少?
a <= a + 1'b1;
右边有被截断的风险吧
这个就是准确的啊~
能具体解释一下吗?谢谢~
凑热闹,看看到底风险在哪!
我也是囫囵吞枣,如果不慎误人子弟不要怪我 不是问你a的位宽么,如果a的位宽大于1位, a + 1'b1的结果很可能是a[0] + 1'b1,然后再赋值给左边a,则高位自动补零
a[N:1] <={N{1'b0}};
a[0] <= ~a[0];
作为一个纯粹的受控计数器,没有任何问题,不管是仿真还是实现
可以问下你们头儿具体问题在哪里
我觉得 这个在所有的计数器中都不会有影响
我决定不修改,等所谓内部审查的结果出来我再来分享给大家讨论~
异步复位有没有同步到当前时钟域? 否则会有风险。
可能是coding style不好吧,给你一个我写的参考一下,a_r就是a,我们这边一般都要求这么写,尽量不要在时序always块中加入运算逻辑,最多加一个使能信号(flag),一般逻辑运算都放在组合逻辑中完成。
assign a_p = a_r + 1'b1;
always @ (posedge clk or negedge rst_n)
begin
if(!rst_n)
a_r <= 'b0;
else if(flag)
a_r <= a_p;
end
