FPGA 21 ,深入理解 Verilog 中的基数,以及二进制数与十进制数之间的关系( Verilog中的基数 )

news2025/1/16 12:56:04

目录

前言
一. 基数基础
1.1 基数介绍
2.1 基数符号
3.1 二进制数
二. 二进制与十进制数
三. 二进制数
3.1 定义寄存器类型变量
3.2 定义线网类型变量
3.3 赋值操作
3.4 解析二进制数为十进制数
四. 代码示例
五. 注意事项
六. 更多操作

前言

在Verilog中,基数(radix)用于指定数字的进制。Verilog 支持多种基数表示法,包括二进制(binary)、八进制(octal)、十进制(decimal)和十六进制(hexadecimal)。这些不同的基数表示法,使得我们可以方便地使用最适合当前上下文的数值表示方式。

因此在数字逻辑设计和FPGA开发中,理解二进制数及其与十进制数之间的关系是至关重要的。本文将详细介绍4位二进制数,可以表示的范围,以及它们如何映射到无符号整数,并通过具体的Verilog代码示例来说明这些概念。此外,我们还将探讨一些编程时需要注意的事项,帮助我们避免常见的错误。

一. 基数基础

基数与二进制数,基础知识

1.1 基数介绍

在Verilog中,基数(或称数制)是用来表示数字常量的一种方式。Verilog 支持几种不同的基数,包括二进制、八进制、十进制和十六进制。这些基数可以用于定义整型数值,并且可以在代码中通过特定的前缀来标识。

以下是 Verilog 中使用不同基数表示数字常量的方法:

  1. 二进制 (Binary): 使用 bB 作为后缀。

    • 示例:4'b0011 表示一个4位宽的二进制数,值为3。
  2. 八进制 (Octal): 使用 oO 作为后缀。

    • 示例:3'o5 表示一个3位宽的八进制数,其值为5(即十进制中的5)。
  3. 十进制 (Decimal): 可以直接书写数字,或者使用 dD 作为后缀。

    • 示例:8 或 4'd8 表示一个4位宽的十进制数,值为8。如果宽度不足以容纳该值,则会发生截断或填充。
  4. 十六进制 (Hexadecimal): 使用 hH 作为后缀。

    • 示例:8'hAA 表示一个8位宽的十六进制数,值为170(AA是十六进制表示)。

当指定一个带宽度的常量时,格式为 <width>'<radix><value>,其中:

  1. <width> 是一个正整数,指定了该数值的位宽。
  2. <radix> 是表示基数的字母(如 b, o, d, h)。
  3. <value> 是根据所选基数的实际数值。

例如:

  1. 8'b1100_1100 表示一个8位宽的二进制数,值为204(允许下划线以提高可读性)。
  2. 16'hFFFF 表示一个16位宽的十六进制数,所有位均为1。

如果没有明确给出宽度,那么默认的宽度将取决于上下文,或者是工具设定的默认值。对于十进制数,如果不指定基数,可以直接写成纯数字形式,如 123,它会被认为是一个十进制数。

2.1 基数符号

  1. 二进制 (Binary): b 或 B
  2. 八进制 (Octal): o 或 O
  3. 十进制 (Decimal): d 或 D (但通常可以省略)
  4. 十六进制 (Hexadecimal): h 或 H

这些符号直接跟在宽度说明之后、数值之前使用。例如,4'b1010 表示一个4位宽的二进制数。

3.1 二进制

这里来着重说一下二进制,二进制是一种基于2的计数系统,它使用0和1两个符号来表示数值。每个二进制位(bit)都可以处于两种状态之一:0 或 1。对于一个n位的二进制数,它可以表示 2n 种不同的值。具体来说,4位二进制数,能够表示从 0 (0000) 到 15 (1111) 的无符号整数,总共16种不同的值。

二进制 (Binary)(4位二进制数)十进制 (Decimal)
00000
00011
00102
00113
01004
01015
01106
01117
10008
10019
101010
101111
110012
110113
111014
111115


二. 二进制与十进制数

解析二进制数为十进制数

要解析一个4位二进制数为十进制数,你可以将每个二进制位乘以其权重,并将结果相加。权重是2的幂次方,从右向左递增,最低位(最右边的一位)的权重是 2020,最高位(最左边的一位)的权重是 2(n−1)2(n−1),其中 nn 是位数。对于4位二进制数,权重如下:

  • 第0位(最右边):20=120=1
  • 第1位:21=221=2
  • 第2位:22=422=4
  • 第3位(最左边):23=823=8

例如,对于二进制数 1101

  • 第0位(最右边)是 1,其权重是 20=120=1,所以 1×1=11×1=1
  • 第1位是 0,其权重是 21=221=2,所以 0×2=00×2=0
  • 第2位是 1,其权重是 22=422=4,所以 1×4=41×4=4
  • 第3位(最左边)是 1,其权重是 23=823=8,所以 1×8=81×8=8

将这些结果相加:1+0+4+8=131+0+4+8=13,因此二进制数 1101 对应的十进制数是 13

计算方式总结:

十进制值=b3×23+b2×22+b1×21+b0×20十进制值=b3​×23+b2​×22+b1​×21+b0​×20

其中 bibi​ 表示第 ii 位的二进制值(0或1)。

图例:


三. 二进制数

Verilog 中的4位二进制数

在Verilog中,我们可以定义不同类型的变量,来存储二进制数据,最常用的是 reg 和 wire 类型。下面我们将介绍,如何在Verilog中定义、赋值和操作4位二进制数。

3.1 定义寄存器类型变量

// 定义一个4位宽的寄存器,用于保存二进制数
reg [3:0] myRegister;
  1. [3:0] 表示这是一个4位宽的寄存器。
  2. myRegister 是变量名。 

3.2 定义线网类型变量

// 定义一个4位宽的线网,用于连接组合逻辑或模块输出
wire [3:0] myWire;
  • 注意,wire 类型不能保存状态,必须由其他逻辑驱动。

3.3 赋值操作

// 使用过程赋值给寄存器
always @(posedge clk) begin // 在时钟上升沿触发
    myRegister <= 4'b1101; // 给myRegister赋值为二进制1101(即十进制13)
end

// 使用连续赋值给线网
assign myWire = 4'b0011; // 给myWire赋值为二进制0011(即十进制3)
  1.  过程赋值使用 <=,而连续赋值使用 =.
  2. clk 是时钟信号,posedge 表示在时钟上升沿触发。 

3.4 解析二进制数为十进制数

// 计算二进制1101对应的十进制值
integer decimalValue;
always @(*) begin // 组合逻辑块
    decimalValue = 8 * myRegister[3] + 4 * myRegister[2] + 2 * myRegister[1] + 1 * myRegister[0];
end
  1. 这里使用了组合逻辑块 @(*) 来确保每当输入发生变化时都会重新计算。
  2. integer 类型用于存储较大的数值,如十进制结果。


四. 代码示例

以下是一个完整的Verilog代码示例,展示了如何定义、赋值和解析4位二进制数。

module binaryToDecimal(
    input wire clk, // 时钟信号
    output reg [3:0] myRegister, // 寄存器输出
    output wire [3:0] myWire, // 线网输出
    output integer decimalValue // 十进制输出
);

// 给寄存器赋值
always @(posedge clk) begin
    myRegister <= 4'b1101; // 在时钟上升沿更新寄存器值
end

// 给线网赋值
assign myWire = 4'b0011;

// 解析二进制数为十进制
always @(*) begin
    decimalValue = 8 * myRegister[3] + 4 * myRegister[2] + 2 * myRegister[1] + 1 * myRegister[0];
end

endmodule

这段代码创建了一个简单的模块,其中包含了寄存器和线网的定义、赋值,以及将寄存器内的4位二进制数解析为十进制的过程。注意,这里为了简化演示,省略了复位逻辑和其他可能需要的功能。在实际应用中,您应该根据需求添加适当的控制逻辑。


五. 注意事项

  1.  不要混淆 reg 和 wire:虽然它们可以有相同的位宽,但用途不同,reg 用于保存状态,而 wire 必须由其他逻辑驱动。
  2. 初始化问题:在仿真环境中,未初始化的 reg 变量默认为未知状态 'x',这可能导致意外行为。
  3. 溢出处理:当对寄存器进行算术运算时,请确保不会超出其位宽所能表示的最大值,否则会导致溢出。
  4. 资源优化:合理规划位宽可以节省硬件资源,在FPGA上尤为重要。 

本文总结

理解和正确使用二进制数是数字逻辑设计的基础。通过本文,希望你能更好地掌握4位二进制数在Verilog中的表示方法及应用技巧。无论是学习还是实际项目开发中,都应牢记上述注意事项,以编写高效且可靠的代码。


六. 更多操作

早期,之前的基数介绍,请看

FPGA 9 ,Verilog 中的关键字和基数icon-default.png?t=O83Ahttps://blog.csdn.net/weixin_65793170/article/details/141625021完整FPGA系列,请看

FPGA系列,文章目录icon-default.png?t=O83Ahttps://blog.csdn.net/weixin_65793170/article/details/144185217?spm=1001.2014.3001.5501

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

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

相关文章

开始使用Panuon开源界面库环境配置并手写VS2019高仿界面

1. Panuon环境配置 1.1. 通过Nuget 安装 Panuon.WPF.UI1.2. xaml引用命名空间1.3. using Panuon.WPF.UI; 2. VS2019 view 2.1. 设置窗体尺寸和title2.2. 添加静态资源 2.2.1. 什么是静态资源 2.3. 主Grid 2.3.1. 盒子模型2.3.2. 嵌套布局 3. 总结 1. Panuon环境配置 1.1. 通…

blender导出镜头动作vmd

1 选中相机 2 在相机属性中找到 MMD摄像机工具 3 在弹窗中给 烘焙动画 打勾&#xff08;图中没忘打了&#xff09;点击确定 等待烘焙完成 4 烘焙结束后选中刚刚新增的物体 5 在mmd tools中点击 动作-导出&#xff08;图中已经导出了&#xff0c;故显示灰色&#xff09;

RabbitMQ确保消息可靠性

消息丢失的可能性 支付服务先扣减余额和更新支付状态&#xff08;这俩是同步调用&#xff09;&#xff0c;然后通过RabbitMq异步调用支付服务更新订单状态。但是有些情况下&#xff0c;可能订单已经支付 &#xff0c;但是更新订单状态却失败了&#xff0c;这就出现了消息丢失。…

重生之我在21世纪学C++—string

一、string 概念 string 字符串是一种更加高级的封装&#xff0c;string 字符串中包含大量的方法&#xff0c;这些方法可以使得字符串的操作变得更加简单。如果 string 使用的好&#xff0c;慢慢你就不想使用字符数组来存放字符串了&#xff0c;因为更简单嘛。 C 将字符串直接…

day10_Structured Steaming

文章目录 Structured Steaming一、结构化流介绍&#xff08;了解&#xff09;1、有界和无界数据2、基本介绍3、使用三大步骤(掌握)4.回顾sparkSQL的词频统计案例 二、结构化流的编程模型&#xff08;掌握&#xff09;1、数据结构2、读取数据源2.1 File Source2.2 Socket Source…

x86_64搭建ARM交叉编译工具链

点击上方"蓝字"关注我们 01、下载 >>> GCC 64位交叉编译下载&#xff1a;https://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabihf/ 喜欢那个版本自己找 02、简介 >>> 交叉编译器中“交叉”的意思就是在一个架构…

迅翼SwiftWing | ROS 固定翼开源仿真平台正式发布!

经过前期内测调试&#xff0c;ROS固定翼开源仿真平台今日正式上线&#xff01;现平台除适配PX4ROS环境外&#xff0c;也已实现APROS环境下的单机飞行控制仿真适配。欢迎大家通过文末链接查看项目地址以及具体使用手册。 1 平台简介 ROS固定翼仿真平台旨在实现固定翼无人机决策…

IOS界面传值-OC

1、页面跳转 由 ViewController 页面跳转至 NextViewController 页面 &#xff08;1&#xff09;ViewController ViewController.h #import <UIKit/UIKit.h>interface ViewController : UIViewControllerend ViewController.m #import "ViewController.h" …

用 Python 自动化处理日常任务

&#x1f496; 欢迎来到我的博客&#xff01; 非常高兴能在这里与您相遇。在这里&#xff0c;您不仅能获得有趣的技术分享&#xff0c;还能感受到轻松愉快的氛围。无论您是编程新手&#xff0c;还是资深开发者&#xff0c;都能在这里找到属于您的知识宝藏&#xff0c;学习和成长…

Linux:地址空间(续)与进程控制

hello&#xff0c;各位小伙伴&#xff0c;本篇文章跟大家一起学习《Linux&#xff1a;地址空间与进程控制》&#xff0c;感谢大家对我上一篇的支持&#xff0c;如有什么问题&#xff0c;还请多多指教 &#xff01; 如果本篇文章对你有帮助&#xff0c;还请各位点点赞&#xff0…

链家房价数据爬虫和机器学习数据可视化预测

完整源码项目包获取→点击文章末尾名片&#xff01;

亿道三防丨三防笔记本是什么意思?和普通笔记本的优势在哪里?

三防笔记本是什么意思&#xff1f;和普通笔记本的优势在哪里&#xff1f; 在现代社会中&#xff0c;笔记本电脑已经成为人们工作和生活中不可或缺的一部分。然而&#xff0c;在一些特殊行业或环境中&#xff0c;普通笔记本电脑由于其脆弱性和对环境条件的敏感性&#xff0c;往…

通过proto文件构建 完整的 gRPC 服务端和客户端案例

基础教程-简单案例&#xff08;快入入门java-grpc框架&#xff09; 参考官方入门案例教程&#xff1a;里面我看proto编译&#xff0c;其实直接用maven就能直接将.proto文件编译成java代码。快速入门 | Java | gRPC 框架https://grpc.org.cn/docs/languages/java/quickstart/ …

UML系列之Rational Rose笔记九:组件图

一、新建组件图 二、组件图成品展示 三、工作台介绍 最主要的还是这个component组件&#xff1b; 然后还有这几个&#xff0c;正常是用不到的&#xff1b;基本的使用第四部分介绍一下&#xff1a; 四、基本使用示例 这些&#xff0c;主要是运用package还有package specifica…

K8S 节点选择器

今天我们来实验 pod 调度的 nodeName 与 nodeSelector。官网描述如下&#xff1a; 假设有如下三个节点的 K8S 集群&#xff1a; k8s31master 是控制节点 k8s31node1、k8s31node2 是工作节点 容器运行时是 containerd 一、镜像准备 1.1、镜像拉取 docker pull tomcat:8.5-jre8…

c++领域展开第十二幕——类和对象(STL简介——简单了解STL)超详细!!!!

文章目录 前言STL简介什么是STLSTL的版本STL的六大组件STL的重要性如何学习STL 总结 前言 上篇博客我们了解了初阶的模版函数&#xff0c;以及有关的一些使用方法。 今天我们来了解了解STL库的有关知识 跟我一起上车吧 STL简介 什么是STL STL&#xff1a;是C标准库的重要组成…

Onedrive精神分裂怎么办(有变更却不同步)

Onedrive有时候会分裂&#xff0c;你在本地删除文件&#xff0c;并没有同步到云端&#xff0c;但是本地却显示同步成功。 比如删掉了一个目录&#xff0c;在本地看已经删掉&#xff0c;onedrive显示已同步&#xff0c;但是别的电脑并不会同步到这个删除操作&#xff0c;在网页版…

科研绘图系列:R语言绘制微生物物种系统发育树(phylogenetic tree)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍构成要素有根树与无根树构建方法应用领域说明的问题教程加载R包数据下载导入数据数据预处理系统发育树可视化准备画图数据1. 构建基础系统发育树 `p1`2. 添加条形图 `p2`3. 添加热图…

1️⃣Java中的集合体系学习汇总(List/Map/Set 详解)

目录 01. Java中的集合体系 02. 单列集合体系​ 1. Collection系列集合的遍历方式 &#xff08;1&#xff09;迭代器遍历&#xff08;2&#xff09;增强for遍历​编辑&#xff08;3&#xff09;Lambda表达式遍历 03.List集合详解 04.Set集合详解 05.总结 Collection系列…

微信小程序:跨页面数据修改全攻略

一、引言 在微信小程序开发中&#xff0c;常常会遇到需要在不同页面之间修改数据的情况。比如在商品详情页添加商品到购物车后&#xff0c;购物车页面需要实时更新商品数量和总价&#xff1b;在用户设置页面修改了个人信息&#xff0c;首页的用户信息展示区域也需要同步更新。…