#131. if 语句与锁存器
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
为消除锁存器,我们应当使组合逻辑过程块中的条件完备,即 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