欢迎光临散文网 会员登陆 & 注册

HDLBits (32) — 条件判断语句锁存

2022-02-07 14:28 作者:僚机Wingplane  | 我要投稿

本题链接:

https://hdlbits.01xz.net/wiki/Always_if2

一个常见错误:如何避免被锁

设计电路时,必须首先考虑电路:

  • 我想要这个逻辑门

  • 我想要一个逻辑的组合块,它有这些输入并产生这些输出

  • 我想要一个逻辑的组合斑点后面跟着一组触发器

  • 你不能先写代码,然后希望它生成一个正确的电路

  • 如果 (cpu_overheated) 那么shut_off_computer = 1;

  • 如果 (~arrived) ,那么keep_driving = ~gas_tank_empty;

语法正确的代码不一定会产生合理的电路(组合逻辑+触发器)。通常的原因是:“除了你指定的人之外的情况下会发生什么?”。Verilog的回答是:保持输出不变。

这种“保持输出不变”的行为意味着需要记住当前状态,从而产生锁存。组合逻辑电路(例如逻辑门)不能记住任何状态。留意 Warning (10240): ... inferring latch(es)"  消息。除非锁存是有意的,否则它几乎总是意味着出现了错误。组合电路必须在所有条件下为所有输出分配一个值,所以通常来说你始终需要else子句或指定输出默认值。

示例

以下代码包含导致锁存的错误行为。修复这些错误,最后的结果是你只有在电脑过热时才会关闭电脑,如果你到达目的地或需要加油时停止开车。

题目

答案

输出波形

条件(if)语句用于控制执行语句要根据条件判断来确定是否执行。

条件语句用关键字 if 和 else 来声明,条件表达式必须在圆括号中。

条件语句使用结构说明如下:

  • if 语句执行时,如果 condition1 为真,则执行 true_statement1 ;如果 condition1 为假,condition2 为真,则执行 true_statement2;依次类推。

  • else if 与 else 结构可以省略,即可以只有一个 if 条件判断和一组执行语句 ture_statement1 就可以构成一个执行过程。

  • else if 可以叠加多个,不仅限于 1 或 2 个。

  • ture_statement1 等执行语句可以是一条语句,也可以是多条。如果是多条执行语句,则需要用 begin 与 end 关键字进行说明。

如果是 if-if-else 的形式,即便执行语句只有一条,不使用 begin 与 end 关键字也会引起歧义。

当然,编译器一般按照就近原则,使 else 与最近的一个 if(例子中第二个 if)相对应。

但显然这样的写法是不规范且不安全的。

所以条件语句中加入 begin 与 and 关键字就是一个很好的习惯。

参考资料:

4.5 Verilog 条件语句 | 菜鸟教程:

https://www.runoob.com/w3cnote/verilog-condition-statement.html


HDLBits (32) — 条件判断语句锁存的评论 (共 条)

分享到微博请遵守国家法律