您的位置:首页 > 房产 > 建筑 > 甘肃网站建设网站制作_网页传奇外挂_除了百度指数还有哪些指数_新闻式软文

甘肃网站建设网站制作_网页传奇外挂_除了百度指数还有哪些指数_新闻式软文

2025/4/21 23:53:37 来源:https://blog.csdn.net/m0_56800366/article/details/147294245  浏览:    关键词:甘肃网站建设网站制作_网页传奇外挂_除了百度指数还有哪些指数_新闻式软文
甘肃网站建设网站制作_网页传奇外挂_除了百度指数还有哪些指数_新闻式软文

🔍 问题本质

在一个 always @(posedge clk) 块中,所有的代码都是顺序执行的。但这不意味着它就像软件一样“一条一条执行”,因为最终是电路!电路是并行存在的!

Verilog 是硬件描述语言(HDL),你写的 if 看起来像判断语句,实际上是用来描述硬件行为的。比如赋值,就是描述电路连线和寄存器触发器之间的连接与更新方式


🌰例子一:多个 if 控制不同变量(并行)

always @(posedge clk) beginif (a) x <= 1;if (b) y <= 2;
end

✅ 分析:

  • xy 是两个不同的变量(信号)

  • if (a)if (b) 虽然写在一个 always 里,但它们控制的是不同的变量

  • 所以它们最终在硬件上是并行存在的,谁满足条件谁赋值,互不干扰

🎯 打比方:

你想象有两个电工:

  • 电工A:看到 a=1 就把灯 x 打开

  • 电工B:看到 b=1 就把灯 y 点亮

两个电工各干各的,不会打架。


🌰例子二:多个 if 控制同一个变量(后面会覆盖前面)

always @(posedge clk) beginif (a) x <= 1;if (b) x <= 2;
end

⚠️ 注意:

  • 现在两个 if 都是对 x 赋值

  • 如果 a=1b=1,那么两个赋值都触发,但最后一个有效

💥 为什么?

Verilog 顺序描述 => 最后一个赋值会“覆盖”前面那个 所以:

  • 如果 a=1b=1x <= 2

  • 如果 a=1b=0x <= 1

  • 如果 a=0b=1x <= 2

🎯 打比方:

还是两个电工:

  • 电工A先来,把灯 x 调到1

  • 电工B后到,把灯 x 调到2

最后你看到灯 x 是2,电工A的动作被“覆盖”了
 

这里如果有疑惑,可以看这篇博客:
【verilog】多个 if 控制同一个变量(后面会覆盖前面)非阻塞赋值真的并行吗?


🌰例子三:中间插入打拍语句(可以)

always @(posedge clk) beginif (a)x <= 1;x_d1 <= x;  // 打拍:让x的值走一拍if (b)x <= 2;
end

⚠️ 这个时候 x <= 1 先执行,但后面又 x <= 2,会不会有问题?

会被覆盖!除非你做数据隔离或选择性赋值


🌰例子四:多个 if else + case 都是并行行为的体现

always @(posedge clk) beginif (sel == 0)x <= 1;else if (sel == 1)x <= 2;case(sel)2: x <= 3;3: x <= 4;endcase
end

😵‍ 分析:

  • 如果 sel == 2,那么:上面 if-else 不触发,case 触发 x <= 3

  • 如果 sel == 1,if-else 触发 x <= 2,case 不触发

但是注意,如果你写多个能影响同一个变量的赋值语句,它们中间的优先级以代码顺序为准


✅ 结论总结

情况行为说明
多个 if 控制不同变量并行谁条件满足谁执行,互不干扰
多个 if 控制同一个变量顺序后面赋值覆盖前面
if/else + case 控制同一变量顺序+可能冲突后面的 case 会覆盖前面 if 的赋值
插入打拍语句合法不影响并行结构,但要注意覆盖风险
多个嵌套 if按照语句顺序但并不表示电路是串行运行,是条件表达上的判断顺序

😎 建议写法

为了代码清晰和避免莫名其妙的赋值冲突:

  • 推荐使用 if-else if-else 结构统一处理一个变量的所有情况

  • 或者先保存中间变量,最后统一赋值

  • 打拍信号最好和主赋值语句分开块写,减少混乱


版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com