HDLBits 练习 Always if2

news/2024/9/1 20:11:01 标签: fpga

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

http://www.niftyadmin.cn/n/4989281.html

相关文章

一文了解评估 K8s 原生存储产品需要关注的关键能力

近些年,越来越多的企业使用 Kubernetes(K8s)支持生产环境关键业务。这些业务往往对存储性能和稳定性具有更高的要求,传统存储方案难以充分满足,因此不少用户开始关注更契合 K8s 环境的 K8s 原生存储方案。 不过&#…

openGauss学习笔记-56 openGauss 高级特性-DCF

文章目录 openGauss学习笔记-56 openGauss 高级特性-DCF56.1 架构介绍56.2 功能介绍56.3 使用示例 openGauss学习笔记-56 openGauss 高级特性-DCF DCF全称是Distributed Consensus Framework,即分布式一致性共识框架。DCF实现了Paxos、Raft等解决分布式一致性问题典…

Truncation Sampling as Language Model Desmoothing

本文是LLM系列文章,针对《Truncation Sampling as Language Model Desmoothing》的翻译。 截断采样作为语言模型的去平滑性 摘要1 引言2 背景3 截断作为去平滑性4 方法5 实验与结果6 相关工作7 结论8 不足 摘要 来自神经语言模型的长文本样本可能质量较差。截断采…

UE 5 实现骨骼物理模拟 乳摇

打开角色的物理资产,如果是下载的或者官方的模型,都会内带物理资产 模拟 可以根据分块模拟当前物体的物理效果 点击右上角的模拟,可以模拟布娃娃系统 Ctrl鼠标右键可以实现对布娃娃施加力的效果。 模拟选中项 模拟选中项可以只模拟一部…

Linux查看目录下文件及其大小

ls -lh在Linux下,"ls -lh"是一个用于显示文件和目录详细信息的命令。它会列出当前目录中的文件和目录,并显示它们的文件大小和权限等详细信息。 其中,参数"-l"是用来显示详细信息的选项,"h"表示以…

kafka复习:(25)kafka stream

一、java代码: package com.cisdi.dsp.modules.metaAnalysis.rest.kafka2023;import org.apache.kafka.common.serialization.Serdes; import org.apache.kafka.streams.KafkaStreams; import org.apache.kafka.streams.StreamsBuilder; import org.apache.kafka.s…

Redis的缓存穿透,缓存击穿,缓存雪崩

1. 缓存穿透 什么是缓存穿透? 缓存穿透说简单点就是大量请求的 key 是不合理的,根本不存在于缓存中,也不存在于数据库中 。这就导致这些请求直接到了数据库上,根本没有经过缓存这一层,对数据库造成了巨大的压力&…

k8s nfs-client 添加挂载参数 —— 筑梦之路

背景介绍 为什么要使用noresvport参数挂载NAS?不重新挂载会有什么后果? 如果发生网络切换或者后端服务的HA倒换,小概率会造成NFS文件系统阻塞,那就可能需要几分钟时间连接才会自动恢复,极端情况下甚至需要重启ECS才能恢…