HDLbits 刷题 -- Always if

学习:

An if statement usually creates a 2-to-1 multiplexer, selecting one input if the condition is true, and the other input if the condition is false.

always @(*) begin
    if (condition) begin
        out = x;
    end
    else begin
        out = y;
    end
end

This is equivalent to using a continuous assignment with a conditional operator:

assign out = (condition) ? x : y;

However, the procedural if statement provides a new way to make mistakes. The circuit is combinational only if out is always assigned a value.

译:

 一个 if 语句通常会产生一个2选1的多路选择器(multiplexer),如果条件为真,则选择一个输入;如果条件为假,则选择另一个输入。

这相当于使用带有条件运算符的连续赋值(continuous assignment):

assign out = (condition) ? x : y;

然而,程序化的 if 语句提供了犯新错误的可能。只有当输出 out 总是被赋值时,电路才是组合逻辑的。

练习:

Build a 2-to-1 mux that chooses between a and b. Choose b if both sel_b1 and sel_b2 are true. Otherwise, choose a. Do the same twice, once using assign statements and once using a procedural if statement.

构建一个2选1多路选择器(2-to-1 mux),在 ab 之间进行选择。如果 sel_b1sel_b2 都为真,则选择 b。否则,选择 a。用两种方式完成这个任务,一次使用赋值语句(assign statements),一次使用程序化的 if 语句。

sel_b1sel_b2out_assign
out_always
00a
01a
10a
11b
// synthesis verilog_input_version verilog_2001
module top_module(
    input a,
    input b,
    input sel_b1,
    input sel_b2,
    output wire out_assign,
    output reg out_always   ); 
    assign out_assign = (sel_b1 & sel_b2)?b:a;
    always@(*) begin
        if (sel_b1 & sel_b2) begin
            out_always = b;
        end
        else begin 
            out_always = a;
        end
    end
endmodule

运行结果:

分析:

        主要是两种判断方式的使用,一种是前面提到的三元选择法(三元运算符);另外就是if - else的方法;

        使用if - else的方法要注意使用格式,配合好 begin - end 的调用;另外 if- else 只能在 always中调用,要注意赋值方式;关于赋值方式的选择,参考上一篇;

        

介绍begin - end

在硬件描述语言(HDL)如Verilog和SystemVerilog中,`begin` 和 `end` 是用来定义代码块的关键字。它们通常成对出现,用以标识一段特定的代码区域的开始和结束。这种结构在编写复杂的赋值语句、条件语句、循环语句以及其他控制结构时非常有用。

   组合逻辑中的 `begin` - `end`

在组合逻辑的 `always` 块中,`begin` 和 `end` 用于包含一系列的赋值和操作,这些操作是同时发生的,不涉及时序控制。

 

always @(a or b) begin
  // 组合逻辑操作
  output = a & b; // 逻辑与操作
  // 更多的组合逻辑操作...
end

在这个例子中,`begin` 和 `end` 之间的代码块定义了输出信号 `output` 是如何根据输入信号 `a` 和 `b` 的逻辑与结果来计算的。

### 时序逻辑中的 `begin` - `end`

在时序逻辑的 `always` 块中,`begin` 和 `end` 也用于定义代码块,但这里的操作是按照它们在代码中出现的顺序依次执行的,并且通常与时钟信号的边沿同步。

 

always @(posedge clk) begin
  // 时序逻辑操作
  if (reset) begin
    reg_value = 0; // 异步复位
  end else begin
    reg_value = input; // 时钟边沿触发的赋值
  end
end

在这个例子中,`begin` 和 `end` 之间的代码块定义了一个寄存器 `reg_value` 的行为。当复位信号激活时,`reg_value` 被异步清零;否则,在时钟的上升沿,`reg_value` 会被 `input` 的值更新。

### 条件语句中的 `begin` - `end`

在 `if`、`else if`、`else` 条件语句中,`begin` 和 `end` 用于定义每个条件分支的代码块。

if (condition1) begin
  // 条件1为真时执行的代码
end else if (condition2) begin
  // 条件2为真时执行的代码
end else begin
  // 所有条件都不为真时执行的代码
end

### 循环语句中的 `begin` - `end`

在 `for`、`while` 循环语句中,`begin` 和 `end` 定义了循环体中的操作。

 

for (i = 0; i < N; i = i + 1) begin
  // 循环体内的代码
end

在这个例子中,`begin` 和 `end` 之间的代码块定义了 `for` 循环的执行体。

### 总结

`begin` 和 `end` 是Verilog和SystemVerilog中定义代码块的重要结构。它们使得代码更加结构化和模块化,提高了代码的可读性和可维护性。无论是在组合逻辑还是时序逻辑中,正确地使用这些关键字对于设计正确的硬件电路至关重要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/507625.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

衍生品交易概况

场内 场外 交易台架构 报价、交易、研究、程序个股、股指Flow、Exotic线性、非线性 对冲管理 管理风险敞口 做好情景分析 尊重市场选择 及时调整策略 理解头寸 善于学习 场外衍生品交易员的一天 盘前 回顾市场、决定今天总体方向处理隔夜敞口 盘中 处理客户询价…

关于 HEAP CORRUPTION DETECTED:after Normal block 错误的原因及解析

目录 一、HEAP CORRUPTION DETECTED:after Normal block 出现的报错情况&#xff1a; 二、问题原因&#xff08;重要&#xff09;&#xff1a; 三、举例 1.错误代码如下&#xff1a; 2.错误原因及分析&#xff08;重要&#xff09;&#xff1a; 3.解决方法 ​编辑 4.正…

两数之和-考察哈希表的运用

题目 给定一个整数数组 n u m s nums nums和一个整数目标值 t a r g e t target target&#xff0c;请你在该数组中找出和为目标值 t a r g e t target target的那 两个整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同…

计算机网络数据链路层知识总结

物理层知识总结传送门 计算机网络物理层知识点总结-CSDN博客 功能 功能概述 一些基本概念 结点:主机、路由器链路﹔网络中两个结点之间的物理通道&#xff0c;链路的传输介质主要有双绞线、光纤和微波。分为有线链路、无线链路。数据链路︰网络中两个结点之间的逻辑通道&a…

“数字化”持续走热,VR全景助力制造业上“云”

制造业要升级&#xff0c;数字化改造是重要途径。 早年间&#xff0c;由于对数字化的认识不足&#xff0c;一些企业明明有数字化改造需求&#xff0c;却不敢、不愿、不会上“云”。直到此次两会期间&#xff0c;2024年政府工作报告再次提出推动制造业数字化转型&#xff0c;越…

第十三届蓝桥杯JavaA组省赛真题 - 求和

解题思路&#xff1a; 这&#xff0c;真的是&#xff0c;省赛真题吗... public class Main {public static void main(String[] args) {long res 0;for (int i 1; i < 20230408; i) {res i;}System.out.print(res);} }

MYSQL——索引分类索引语法

索引分类 索引分类 在MySQL数据库&#xff0c;将索引的具体类型主要分为以下几类&#xff1a;主键索引、唯一索引、常规索引、全文索引。 当你在创建表的时候&#xff0c;给某个字段加上主键约束&#xff0c;实际上就是在这个字段上创建了一个主键索引。给某个字段加上唯一约…

​数据结构—栈操作经典案例

括号匹配&#xff1a; 这是我最开始写的&#xff0c;运行有问题 对于输入的括号序列&#xff0c;建议使用标准的 C 字符串而不是字符数组。 #include<iostream> using namespace std;typedef char SelemType; typedef int Status; #define OK 1 #define MAXSIZE 100 #…

Mysql数据库:故障分析与配置优化

目录 前言 一、Mysql逻辑架构图 二、Mysql单实例常见故障 1、无法通过套接字连接到本地MySQL服务器 2、用户rootlocalhost访问被拒绝 3、远程连接数据库时连接很慢 4、无法打开以MYI结尾的索引文件 5、超出最大连接错误数量限制 6、连接过多 7、配置文件/etc/my.cnf权…

element UI中设置图片的高度并支持PC和手机自适应

系列文章目录 一、elementui 导航菜单栏和Breadcrumb 面包屑关联 二、element UI左侧导航菜单栏与main区域联动 三、element UI中设置图片的高度并支持PC和手机自适应 文章目录 系列文章目录前言一、实现步骤设置图片的高度以适应不同的设备&#xff1a; 二、项目应用最终效…

【Laravel】06 数据库迁移工具migration

【Laravel】06 数据库迁移工具migration 1.migration文件目录2. 举例 1.migration文件目录 2. 举例 (base) ➜ example-app php artisan migrate Migration table created successfully. Migrating: 2014_10_12_000000_create_users_table Migrated: 2014_10_12_000000_crea…

学习笔记——C语言基本概念指针(下)——(8)

1.指针和数组 数组指针 -- 指向数组的指针。 指针数组 -- 数组的元素都是指针。 换句话理解就是&#xff1a;数组指针就是个指针&#xff0c;指针数组就是个数组。 1.1数组指针 数组指针&#xff1a;指向数组的指针&#xff1b; 先回顾一下数组的特点&#xff1a; 1.相…

最大连续1的个数 Ⅲ【滑动窗口】

文章目录 往期滑动窗口上上期&#xff1a;滑动窗口0.1分析0.2 暴力求解【超时】0.3 滑动窗口 上期&#xff1a; 滑动窗口1.1暴力哈希1.2滑动窗口 本期 往期滑动窗口 上上期&#xff1a;滑动窗口 0.1分析 这道题要求的是一个区间 是区间就有【第一个元素】 即起始位置 0.2 暴…

算法学习——LeetCode力扣动态规划篇1(509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯、62. 不同路径、63. 不同路径 II)

算法学习——LeetCode力扣动态规划篇1 509. 斐波那契数 509. 斐波那契数 - 力扣&#xff08;LeetCode&#xff09; 描述 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项…

Nessus【部署 01】Linux环境部署漏洞扫描工具Nessus最新版详细过程分享(下载+安装+注册+激活)

Nessus最新版详细部署过程分享 1. 获取激活码2.主程序下载安装启动2.1 下载2.2安装2.3 启动 3.许可证及插件3.1 许可证获取3.2 插件安装 4.安装总结 Nessus官方网站&#xff1a; https://www.tenable.com/products/nessus/nessus-essentials 及介绍&#xff1a; 国际数据公司&…

WebUI自动化必备技能-HTML和css知识详解

学习web自动化的前提条件&#xff1a;手工测试&#xff08;了解各种测试的知识&#xff09;、学习编程语言、学习Web基础、学习自动化测试工具 、学习自动化测试框架 、需要掌握前端的一些知识&#xff0c;无论学习语言还是前端知识&#xff0c;都是为了接下来的脚本和框架做铺…

DIY 3 种分库分表分片算法,自己写的轮子才吊!

大家好&#xff0c;我是小富&#xff5e; 前言 本文是《ShardingSphere5.x分库分表原理与实战》系列的第六篇&#xff0c;书接上文实现三种自定义分片算法。通过自定义算法&#xff0c;可以根据特定业务需求定制分片策略&#xff0c;以满足不同场景下的性能、扩展性或数据处理…

常见微服务的组件?

注册中心&#xff1a;就是一个服务注册的地方&#xff0c;我们可以把拆分的服务注册到注册中心&#xff0c;这样注册中心就能管理这些服务&#xff0c;服务之间的调用就会很方便&#xff0c;通过服务名就能相互调用。 负载均衡&#xff1a;被调用放的负载均衡&#xff0c;比如…

单位K与ROM/RAM地址转化的关系?

文章目录 如题如图 如题 在单片机开发中&#xff0c;经常会见到多少K空间这样的字眼&#xff1f;我经常会忘记两者之间的关系&#xff0c;每次都要回想一下&#xff0c;才能明白&#xff0c;这次作为笔记记录一下 如图 这是我以前的笔记&#xff0c;平常所说的多少K是指多少K…

如何在jmeter中快速开发性能脚本?这个功能你需要知道。

在使用jmeter做性能测试时 &#xff0c;基本都是针对以下的两种类型的性能测试&#xff1a; 对web系统页面的性能测试 对系统的接口进行性能测试 有页面的可以优先测试页面 &#xff0c;但是如果是APP或小程序的性能测试 &#xff0c;更多的是对接口进行性能测试 。那么接下来…