#131. if 语句与锁存器

    ID: 131 Type: Default 1000ms 256MiB

if 语句与锁存器

题目描述

使用 verilog 设计电路时,应按照如下流程:

  • 确定你需要的电路或逻辑门
  • 确定输入输出信号,以及产生输出信号的组合逻辑块
  • 确定组合逻辑块后面是否加上一组触发器。

因此,应极力避免这样的心态:试着写下一段代码,然后期待其生成正确的电路,如:

  • if (cpu_overheated) then shut_off_computer = 1;
  • if (~arrived) then keep_driving = ~gas_tank_empty;

语法正确的代码并不一定能产生功能正常的电路,一般来说都是因为不小心引入了锁存器造成的。如上述例子所示,除了指定的情况外(cpu_overheated),还有一些其它情况,这时会发生什么?在 verilog 中,其结果就是保持不变,这意味着要记住当前状态,从而产生了锁存。

另一个例子代码与图示如下:

always @(*) begin
    if (cpu_overheated)
       shut_off_computer = 1;
end

always @(*) begin
    if (~arrived)
       keep_driving = ~gas_tank_empty;
end

image 为消除锁存器,我们应当使组合逻辑过程块中的条件完备,即 if 语句后应加上 else 语句。 试修改上述两段代码,以消除锁存器。

输入格式

输入信号 cpu_overheated, 位宽 1bit,控制 shut_off_computer 信号。 输入信号 arrived, 位宽 1bit,控制 keep_driving 信号。 输入信号 gas_tank_empty,位宽 1bit, 作为 keep_driving 的输入信号之一。

输出格式

输出信号 shut_off_computer,位宽 1bit,要求 cpu_overheated 为真时输出 1'b1,反之输出 1'b0。 输出信号 keep_driving,位宽 1bit,要求 arrived 为假时输出 ~gas_tank_empty,反之输出 1'b0。

示例代码

module top (
    input       cpu_overheated      ,
    output  reg shut_off_computer   ,
    input       arrived             ,
    input       gas_tank_empty      ,
    output  reg keep_driving
);
    // Edit the code below
    
endmodule