HDLBits笔记6:Circuits.Combinational Logic.Multiplexers + Arithmetic Circuits

news2025/1/18 5:37:48

Multiplexers

2-to-1 multiplexer

module top_module( 
    input a, b, sel,
    output out ); 
    assign out = sel ? b : a;
endmodule

2-to-1 bus multiplexer

module top_module( 
    input [99:0] a, b,
    input sel,
    output [99:0] out );
    assign out = sel ? b : a;
endmodule

9-to-1 multiplexer

建立一个16bit位宽的9选1多路选择器,sel=0选择a,以此类推,其他情况输出全1

module top_module( 
    input [15:0] a, b, c, d, e, f, g, h, i,
    input [3:0] sel,
    output [15:0] out );
    always @(*) begin
        case(sel)
            4'h0: out = a;
            4'h1: out = b;
            4'h2: out = c;
            4'h3: out = d;
            4'h4: out = e;
            4'h5: out = f;
            4'h6: out = g;
            4'h7: out = h;
            4'h8: out = i;
            default: out = 16'hffff;
        endcase
    end
endmodule

256-to-1 multiplexer

建立一个256选1多路选择器,输入打包成一个256bit向量形式,sel=0选择in[0],以此类推

module top_module( 
    input [255:0] in,
    input [7:0] sel,
    output out );
    assign out = in[sel];
endmodule

256-to-1 4bit multiplexer

建立一个4bit位宽的256选1多路选择器,输入打包成一个1024bit向量形式,sel=0选择in[3:0],以此类推

module top_module( 
    input [1023:0] in,
    input [7:0] sel,
    output [3:0] out );
    assign out = in[sel*4 +: 4];
endmodule

Arithmetic Circuits

Half adder

建立一个半加器,没有cin

module top_module( 
    input a, b,
    output cout, sum );
    assign cout = a & b;
    assign sum = a ^ b;
endmodule

Full adder

建立一个全加器,有cin

module top_module( 
    input a, b, cin,
    output cout, sum );
    assign cout = (a & b) | (b & cin) | (a & cin);
    assign sum = a ^ b ^ cin;
endmodule

3-bit binary adder

实例化3个全加器,建立一个3-bit行波进位加法器

module top_module( 
    input [2:0] a, b,
    input cin,
    output [2:0] cout,
    output [2:0] sum );
    fadd u1(a[0], b[0], cin, cout[0], sum[0]);
    fadd u2(a[1], b[1], cout[0], cout[1], sum[1]);
    fadd u3(a[2], b[2], cout[1], cout[2], sum[2]);
endmodule

module fadd(
    input a, b, cin,
    output cout, sum
);
    assign cout = (a & b) | (b & cin) | (cin & a);
    assign sum = a ^ b ^ cin;
endmodule

Adder

实现如下电路:

在这里插入图片描述

方法一:根据RTL图,实例化4个全加器

module top_module (
    input [3:0] x,
    input [3:0] y, 
    output [4:0] sum);
    wire [2:0] cout;
    fadd u0(x[0], y[0],    1'b0, cout[0], sum[0]);
    fadd u1(x[1], y[1], cout[0], cout[1], sum[1]);
    fadd u2(x[2], y[2], cout[1], cout[2], sum[2]);
    fadd u3(x[3], y[3], cout[2],  sum[4], sum[3]);
endmodule

module fadd(
    input a, b, cin,
    output cout, sum
);
    assign cout = (a & b) | (b & cin) | (cin & a);
    assign sum = a ^ b ^ cin;
endmodule

方法二:使用+操作符

module top_module (
    input [3:0] x,
    input [3:0] y,
    output [4:0] sum
);
    assign sum = x+y;
endmodule

Signed addition overflow

将两个8-bit的二进制补码a[7:0]b[7:0]相加产生s[7:0],并计算是否有符号位溢出

符号位溢出:两个正数相加得到负数、两个负数相加得到正数

module top_module (
    input [7:0] a,
    input [7:0] b,
    output [7:0] s,
    output overflow
);
    assign s = a + b;
    assign overflow = (~a[7] & ~b[7] & s[7]) | (a[7] & b[7] & ~s[7]);
endmodule

100-bit binary adder

建立一个100-bit的二进制加法器,将两个100-bit的数和cin相加得到100-bit的sum和cout

module top_module( 
    input [99:0] a, b,
    input cin,
    output cout,
    output [99:0] sum );
    assign {cout, sum} = a + b + cin;
endmodule

4-digit BCD adder

提供一个BCD全加器bcd_fadd,其将两个BCD码和cin相加,输出sum和cout,其模块端口如下:

module bcd_fadd (
    input [3:0] a,
    input [3:0] b,
    input     cin,
    output   cout,
    output [3:0] sum );

实例化4个bcd_fadd来建立一个4位数的BCD行波进位加法器,你的加法器要能将两个4位数的BCD数字(16bit位宽)和一个cin相加得到四位数的sum和cout

module top_module ( 
    input [15:0] a, b,
    input cin,
    output cout,
    output [15:0] sum );
    wire [2:0] _cout;
    bcd_fadd u0(a[3:0],     b[3:0],      cin, _cout[0], sum[3:0]);
    bcd_fadd u1(a[7:4],     b[7:4], _cout[0], _cout[1], sum[7:4]);
    bcd_fadd u2(a[11:8],   b[11:8], _cout[1], _cout[2], sum[11:8]);
    bcd_fadd u3(a[15:12], b[15:12], _cout[2],     cout, sum[15:12]);
endmodule

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

逍遥自在学C语言 | 多级指针探秘

前言 多级指针在C语言中是一种特殊的指针类型,它可以指向其他指针的指针。 通过多级指针,我们可以间接地访问或修改存储在内存中的数据。 在本文中,我们将讨论多级指针的概念、使用方法、使用场景以及常见错误及其避免方法。 一、人物简介…

软件项目管理 第六章 软件项目的进度管理 课后习题参考答案——主编:李冰、张桥珍、刘玉娥

第六章 软件项目的进度管理 课后习题参考答案 1.选择题 (1)快速跟进是指(A)。 A.采用并行执行任务,加速项目进展 B.用一个任务取代另外的任务 C.如有可能,减少任务数量 D.减轻项目风险 (2)赶工一个任务时,…

相机畸变概述

上节说到了相机模型,那么这节说说相机的畸变 如果有手机爱好者,听到很多测评进行测评的时候,都会提到一个词,广角防畸变,啥意思,举个栗子 来看下信号塔,是不是已经开始歪了,这就是0.6倍,超广角模式下的畸变(其实一倍也畸变,小声BB) 为啥会畸变呢,仔细看镜头,镜头是曲面的,光…

CDN和DNS

目录 宽带,窄带,带宽区别和联系如何计算带宽带宽和网速的区别和联系 CDNCDN的原理CDN的好处CDN和通信行业DNS和CDN的区别与联系用户访问未使用CDN缓存网站的过程为使用了CDN缓存后的网站的访问过程变为 CDN加速服务 DNSDNS对好处公共 DNS114 DNS阿里DNS百…

Mac安装配置Visual Studio Code(vscode)以及Java环境详细教程(初学者必看)

原本博主今天想继续给大家出Java接下来的教程,但是就在昨天我在配置vscode的时候遇到了一些问题,Windows系统的小伙伴配置起来肯定很方便,但是在Mac的小伙伴却显得十分无奈,所以我想给大家出一篇Mac的Visual Studio Code配置以及Java环境搭建教程! 博客主页:Jovy.的…

C#中调用MATLAB的函数形式的m文件

问题介绍 需要在C#编写的winform中调用matlab写的函数类型的m文件,并在winform中读取m文件的返回值。 之前也写过类似的博客,请参考:C#中调用MATLAB执行MATLAB代码 本篇文章算是之前文章的更新版本吧。 步骤 1 创建C#的winform项目 在桌面…

STM32单片机(九)USART串口----第一节:USART串口协议

❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要…

【博弈论笔记】第二章 完全信息静态博弈

文章目录 第二章 完全信息静态博弈2.1 基本分析思路和方法2.1.1 上策均衡2.1.2 严格下策反复消去法2.1.3 划线法2.1.4 箭头法 2.2 纳什均衡2.2.1 纳什均衡的诞生2.2.2 纳什均衡的定义2.2.3 纳什与严格下策反复消去法2.2.4 一致预测性质 2.3 无限策略博弈和反应函数(…

性能测试的具体流程

以下是一个基本的性能测试过程,旨在帮助了解性能测试的具体流程和步骤。 1. 确定性能测试目标及指标 首先,需要确定性能测试的目标和指标,包括响应时间、吞吐量、并发用户数等方面。这些指标应该根据业务需求和用户场景进行设定&#xff0c…

Unity-Android常见的那些骚操作

老规矩,先安装unity,再安装安卓平台,安装AndroidStudio ,安装JDK,安装SDK 配置JDK 环境,在Unity里面引用SDK 和 JDK Unity中的Android Build Support下载 在Unity中的File>Building Settings>Android>Open Download Pag…

VMware Ubuntu忘记密码修改密码

目录 一、重启 二、重置密码 三、补充 一觉醒来,刚想去虚拟机爽一下Linux却发现忘记了密码? 没关系,这里有详细的步骤帮你修改密码! 一、重启 重启虚拟机,在进度条未读完前,长按shift进入GRUB系统引导…

56 KVM工具使用指南-安装 LibcarePlus

文章目录 56 KVM工具使用指南-安装 LibcarePlus56.1 安装软件依赖56.2 安装 LibcarePlus56.3 查看安装是否成功 56 KVM工具使用指南-安装 LibcarePlus 56.1 安装软件依赖 LibcarePlus 运行依赖于 libunwind、 elfutils 和 binutils,在配置了 yum 源的 openEuler 系…

SpringSecurity中授权时fastjson序列化问题

最近在复习Spring Security&#xff0c;复习的鉴权的时候出现问题。26.封装权限信息_哔哩哔哩_bilibili 如果是从B站中看到&#xff0c;直接说问题可能出现的原因&#xff1a;可能是private List<String> authorities;中的权限信息命名不规范&#xff0c;去掉get&#x…

Python基础篇(十一):装饰器

装饰器 前言1. 装饰器的定义2. 装饰器的应用3. 装饰器的语法4. func(*args, **kwargs) 前言 装饰器是Python中一种强大的函数或类修饰机制&#xff0c;用于在不修改原始函数或类代码的情况下&#xff0c;对其进行功能扩展或修改。装饰器基于函数式编程的概念&#xff0c;通过将…

【计算机网络详解】——知识点复习(期末不挂科版)

配套视频&#xff1a;湖科大教书匠 配套教材&#xff1a;计算机网络&#xff08;第8版&#xff09; 谢希仁 根据学习通要求“掌握”的部分总结的&#xff0c;有亿点点长 &#xff0c;时间来不及就掌握画 ☆ 的就好啦 目录 &#x1f552; 1. 概述&#x1f558; 1.1 三种数据交换…

[英语单词] gated; cycle gated

gate *[geit] n. 门, 牌楼, 大门, 通道, 闸 vt. 装门于 门的原始作用就显示出来了&#xff0c;就是为了在主人自由进出的同时&#xff0c;保护私有财产的安全。 如果加了-ed&#xff0c;就代表使用了动词性&#xff0c;相当于给谁谁加了一个门&#xff0c;限制其行为的自由度。…

SpringBoot 如何使用 ACL 进行访问控制

SpringBoot 如何使用 ACL 进行访问控制 在现代 Web 开发中&#xff0c;访问控制是一个非常重要的问题。访问控制可以帮助我们保护敏感信息、防止恶意攻击、维护系统安全等。Spring Security 是一个非常流行的安全框架&#xff0c;它提供了一系列的认证和授权功能&#xff0c;可…

【网络1】协议及相关命令

文章目录 1.局域网&#xff1a;CSMA/CD2.互联网&#xff1a;ARP&#xff0c;DHCP&#xff0c;NAT3.TCP协议&#xff1a;telnet&#xff0c;tcpdump&#xff0c;syn/accept队列4.HTTPS协议&#xff1a;摘要&#xff08;sha、md5、crc&#xff09;。win对文件MD5校验&#xff1a;…

【博弈论笔记】第三章 完全且完美信息动态博弈

文章目录 第三章 完全且完美信息动态博弈3.1 动态博弈的表示法和特点3.2 策略的可信性和纳什均衡的不稳定问题3.2.1 相机选择和策略的可信性问题3.2.2 纳什均衡的不稳定问题3.2.3 逆推归纳法 3.3 子博弈和子博弈完美纳什均衡3.3.1 子博弈3.3.2 子博弈完美纳什均衡 3.4 四个经典…

规则引擎--函数式编程和and/or操作符的设计

目录 Java函数编程的一些基础知识BiFunctionBinaryOperatorstream reduce And, Or操作符and 逻辑 的 Combiner 如下:or 逻辑 的 Combiner 如下:and, or的执行 接上一篇博文&#xff1a;规则引擎–规则逻辑形如“1 & (2 | 3)“的抽象&#xff0c; 重点分析一下And, Or操作符…