HDLBits 练习 Always if2

博客主要围绕Verilog设计中避免产生锁存器展开。指出设计电路应先从电路角度思考,不能先写代码再期待成合理电路。语法正确的代码不一定能变成合理电路,未指定情况时Verilog会“保持输出不变”产生锁存器,组合逻辑电路需针对所有情况设计值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Always if2

一个常见的错误:如何避免产生锁存器。

当设计一的电路的时候,你首先应该从电路的角度去思考。

  • 我想要一个逻辑门
  • 我想要一个有着3和输入和3输出的组合逻辑电路。
  • 我想要一个后边跟着一个触发器的组合逻辑电路。

你必须不能先写代码,然后就期待它能成为一个真正意义上的电路。

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

语法正确的代码不意味着就一定可以变成合理的电路(组合逻辑 + 触发器)。
一般的理由是 “当你没有具体指定一些情况的时候会发生什么?”。
Verilog 的答案是:“保持输出不变”。

这种“保持输出不变” 的行为意味着当前的状态需要保存下来,这就会产生锁存器。
组合逻辑(例如:逻辑门)是不能记录任何状态的。注意警告“(10240): … inferring latch(es)”信息。
除非这个锁存器是你故意制造的,但是大多数情况都意味着一个 BUG。
组合逻辑电路必须要针对所有的情况设计一个值。这通常意味着你需要 else 或者给 output
指定默认值。

示例:

下面的代码包含了一个不正确的行为,导致产生了一个锁存器。解决掉这个 BUG 如果
你需要在过热的时候关掉电脑,不需要开车在你已经到地方了或者你也不需要去加油。

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

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

在这里插入图片描述

答案

// synthesis verilog_input_version verilog_2001
module top_module (
    input      cpu_overheated,
    output reg shut_off_computer,
    input      arrived,
    input      gas_tank_empty,
    output reg keep_driving  ); //

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

    always @(*) begin
        if (arrived || gas_tank_empty)
           keep_driving = 0;
        else
           keep_driving = 1;
    end

endmodule
03-08
### 关于HDLBits相关的EDA工具和资源 对于希望深入学习硬件描述语言(HDL)并实践数字逻辑设计的人来说,在线平台提供了丰富的资源和支持。其中,HDLBits是一个专注于提高VHDL和Verilog技能的学习网站[^1]。 #### 在线编辑与仿真环境 - **EDA Playground** 是一个强大的在线开发环境,允许用户编写、编译以及模拟各种类型的HDL代码。该平台上不仅支持多种FPGA厂商的标准库文件,还集成了许多开源IP核供开发者调用。此外,它也兼容SystemVerilog等高级特性,非常适合用于教学和个人项目实验。 ```verilog // Example of a simple D flip-flop module in Verilog module dff ( input wire clk, input wire reset_n, input wire d, output reg q ); always @(posedge clk or negedge reset_n) begin if (!reset_n) q <= 0; else q <= d; end endmodule ``` #### 可视化与时序分析工具 - **WaveDrom** 提供了一种简便的方法来创建专业的时序图。这对于理解复杂的信号交互非常有帮助,尤其是在调试阶段或是准备技术文档的时候。只需按照特定语法书写文本描述即可即时渲染成图形化的波形展示。 #### 综合验证辅助 - 对于想要快速测试自己写的RTL级代码能否正常工作的朋友来说,可以利用 http://hdl.huangzzk.info/ 这样的在线综合服务来进行初步的功能性检验。尽管其功能可能不如商业版那么全面,但对于大多数基础练习已经足够用了。 #### 数字计算与算法建模 - 如果涉及到更深层次的设计优化或者性能评估,则可借助像 Octave Online这样的云端IDE完成矩阵运算、数据分析等工作。这类工具能够很好地补充传统EDA流程中的不足之处,特别是在处理大量数据集或执行复杂数学模型方面表现出色。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值