FPGA入门系列5--运算符号

news2024/12/29 11:33:34

文章简介

本系列文章主要针对FPGA初学者编写,包括FPGA的模块书写、基础语法、状态机、RAM、UART、SPI、VGA、以及功能验证等。将每一个知识点作为一个章节进行讲解,旨在更快速的提升初学者在FPGA开发方面的能力,每一个章节中都有针对性的代码书写以及代码的讲解,可作为读者参考。

第六章:运算符号

Verilog HDL 中的运算符号基本和 c 语言中的运算符号相同,本章讲解常用的几种运算符。 

        算数运算符(+、-、x、\、%)是非常熟悉的运算符,只拿%作介绍。在测试文件中我们有时候会想要产生 0~N 之间的数据,那么就可以用求余加上随机函数得到,假设我们实现 0~9 之间的随机数,我们可以按照如下代码示例所示实现。 

代码示例 1: 

reg [3:0] a; 

always #5 a = {$random}%10; 

代码解析 1:

 ① 第 1 行定义一个能表示 0 到 15 的变量;

 ② 第 2 行对随机数取 10 的余数,得到的值为 0~9。 

关系运算符有(>、<、>=、<=、==、!=),关系运算符得到的结果要么为真(1)要么为假(0)。但是在运用中很多人会犯一些错误,比如 b 的结果根据 a 是否在 5~9 来决定,现有如下两种代码示例情况。

代码示例 2: 

代码解析 2:

 ①当 a=2 时,(1)中可写成 5<2<9,此时 5<2 的结果为假(0),2<9 的结果为真(1),所以此时 b=1;同理可知无论 a 为任何值,b 均为 1。所以这种 写法虽然语法无错误,但是实现不了我们想要的功能。 

②当 a=2 时,(2)中可写成 5<2&&2<9,此时此时 5<2 的结果为假(0), 2<9 的结果为假(0),假(0)与(&)假(0)的结果为假(0),所以此时 b=0。此种写法才能满足我们的逻辑功能。

逻辑运算符(&&、||、!)运算的结果只有真(1)和假(0)。对于&&来 说,运算的两个数据有一个为 0,其结果就为 0,否则为 1。对于||来说,只有 运算的两个数据都有 0 时,其结果才为 0,否则为 1。任何数据取 !,逻辑结果则取反。具体举例如下所示。 

代码示例 3:

                        wire[1:0]     a; 

                        wire[2:0]     b; 

                        assign c = a && b; 

                        assign c = a || b; 

                        assign c = ! a; 

代码解析 3:

 ①第 1、2 行定义两个变量,假设 a=2,b=3;

 ②第 3 行求 a&&b 的结果,由于 a、b 都不为 0,所以运算结果为 1; 

③第 4 行求 a||b 的结果,由于 a、b 不同时为 0,所以运算结果为 1; 

④第 5 行求!a 的结果,由于 a 不为 0,所以运算结果为 1。

位运算符(&、|、~)是按照运行数据的每一位分别进行运算的。

对于 & 来说,运算的两个数据的对应位进行相与,结果为每一位相与的值。

对于 | 来说, 运算的两个数据的对应位进行相或,结果为每一位相或的值。

对于 ~ 来说,是将参与运算的数据按位取反。需要注意按位运算是需要将参与运算的数据转变成二进制,然后再运算。举例如下所示。

代码示例 4:

                        wire[1:0] a = 2'b10; 

                        wire[2:0] b = 3'd3; 

                        assign c = a & b; 

                        assign c = a | b; 

                        assign c = ~ a;

                        assign c = & a; 

代码解析 4: 

①第 1、2 行定义两个赋有初始值的变量;

②第 3 行实现 a & b,此时需要将 a 和 b 都转换成二进制,a=2’b10,b=3’b011, 此 时 a 和 b 的 位 宽 不 一 样 , 位 宽 少 的 需 要 在 高 位 补 0 , 最 后 运 算 为 3’b010 & 3’b011 = 3’b010;

③第 4 行实现 a | b,此时需要将 a 和 b 都转换成二进制,a=2’b10,b=3’b011, 此 时 a 和 b 的 位 宽 不 一 样 , 位 宽 少 的 在 高 位 补 0 , 最 后 运 算 为 3’b010 | 3’b011 = 3’b011; 

④第5行实现 ~ a,最后运算为~2’b10 =2’b01; 

⑤第6行实现&a,最后运算为 a[1]&a[0]=1&0=0。

 条件运算符(()?:),assign 语句后面只能跟一条语句,有时候可能会需要在条件不一样时对某变量赋不同的值,所以用条件运算符可以很方便的满足该要求, 示例如下。 

代码示例 5: 

assign a = (b>6) ? 1'b1 : 1'b0 ; 

代码解析 5: 

当 b 大于 6 为真时将顿号前面的值(1'b1)赋值给 a,否则将顿号后面的值(1'b0)赋值给 a。

 赋值运算符(=、<=),阻塞赋值运算符(=)用在组合逻辑中,非阻塞赋值运算符(<=)用在时序逻辑中,非阻塞赋值运算符与小于等于号比较像,但是非阻塞赋值运算符是赋值号,小于等于号是判断符,所以非常好区分。

 移位运算符(>>、<<),>>为右移运算符,每次右移一位,数据的高位补 0;<<为左移运算符,每次左移一位,数据的低位补 0。示例如下所示。 

代码示例 6: 

                        reg[3:0] a = 4'b0110; 

                        always @ (posedge clk)

                            b <= a >> 1'b1; 

                        always @ (posedge clk) 

                            c <= a << 1'b1; 

代码分析 6: 

①第 1 行定义一个寄存器变量 a,其值为 4’b0110; 

②第 2、3 行描述了将 a 右移一位赋值给 b,当遇到 clk 沿时,b=4’b0011; 

③第 4、5 行描述了将 a 左移一位赋值给 c,当遇到 clk 沿时,c=4’b1100。 

位拼接运算符({})可以将不同数据的位拼接成一个新的数据,示例如下所示。

代码示例 7:

                        reg[3:0] a= 4'b0110; 

                        reg[4:0] b= 5'b10110;

                        always @ (posedge clk) 

                        c <= { b[1], a[1:0], b[3], b[1] };

 代码解析 7: 

①第 1、2 行定义了 a、b 两个 reg 型变量,值分别为 4’b0110、 5’b10110; 

②第 3、4 行描述了将 a、b 不同的位拼接成一个新的变量 c,结果 c = 5’b11001。

在第七章中将对Verilog HDL 中的判断语句进行讲解。

FPGA入门系列1--模块书写&电路综合

FPGA入门系列2--仿真验证

FPGA入门系列3--wire与reg

FPGA入门系列4--赋值语句

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

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

相关文章

( 栈和队列) 739. 每日温度 ——【Leetcode每日一题】

❓739. 每日温度 难度&#xff1a;中等 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升高&#xff0c;请在该位置…

32k*16 薪,3年自动化测试历经3轮面试成功拿下华为Offer....

前言 转眼过去&#xff0c;距离读书的时候已经这么久了吗&#xff1f;&#xff0c;从18年5月本科毕业入职了一家小公司&#xff0c;到现在快4年了&#xff0c;前段时间社招想着找一个新的工作&#xff0c;前前后后花了一个多月的时间复习以及面试&#xff0c;前几天拿到了华为…

Java并发编程 —— ThreadPoolExecutor线程池详解

一、什么是线程池 线程池是一种池化技术&#xff0c;是管理一系列线程的资源池。当有任务要处理时&#xff0c;直接从线程池中获取线程来处理&#xff0c;处理完之后线程并不会立即被销毁&#xff0c;而是等待下一个任务。这样实现线程的复用&#xff0c;避免重复创建与销毁线…

司美格鲁肽进入临床竞速期,减肥“神药”生于偶然、火于乱象?

减肥作为一门市场需求旺盛的生意&#xff0c;在很多行业都有所渗透&#xff0c;如今其高潮逐渐来到了医药领域。 CDE&#xff08;国家食品药品监督管理局药品审评中心&#xff09;网站显示&#xff0c;4月17日&#xff0c;联邦制药全资附属公司联邦生物科技&#xff08;珠海横…

Figma导出源文件的方法,用这个方法快速转换其它格式

市场上设计工具层出不穷&#xff0c;Sketch、AdobeXD、Axure、InVision、Figma、Pixso等都是优秀的设计工具&#xff0c;设计师经常面临如何从设计工具中导出文件的问题。 Figma软件的导出功能非常强大&#xff0c;因为轻量化体验受到很多设计师的喜爱。如何保存导出Figma源文…

【Leetcode -19.删除链表的倒数第N个结点 -24.两两交换链表中的节点】

Leetcode Leetcode -19.删除链表的倒数第N个结点Leetcode - 24.两两交换链表中的节点 Leetcode -19.删除链表的倒数第N个结点 题目&#xff1a;给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;he…

软件测试人员在工作中如何运用Linux

从事过软件测试的小伙们就会明白会使用Linux是多么重要的一件事&#xff0c;工作时需要用到&#xff0c;面试时会被问到&#xff0c;简历中需要写到。 对于软件测试人员来说&#xff0c;不需要你多么熟练使用Linux所有命令&#xff0c;也不需要你对Linux系统完全了解&#xff…

vue总线bus的使用和移除注意事项

vue总线bus的使用和移除注意事项 本文目录 vue总线bus的使用和移除注意事项初始化并封装发送事件接收事件移除事件监听实际使用正确测试效果错误测试效果 初始化并封装 在main.js中对bus进行初始化&#xff0c; Bus是一个不具备 DOM 的组件&#xff0c;它具有的仅仅只是它实例…

算法 | 最长回文子串

思路&#xff1a;遍历字符串&#xff0c;对于字符串的每个字符&#xff0c;维持两个游标&#xff08;left&#xff0c;right&#xff09;&#xff0c;找到游标对应字符相等时就同速度向两边扩散。 对于 奇数长度子串&#xff0c;left right 对于偶数成都子串&#xff0c;lef…

RocketMq消息

消息发送 发送同步消息 public class SyncProducer {public static void main(String[] args) throws Exception{DefaultMQProducer producernew DefaultMQProducer(/*please_rename_unique_group_name*/"group1");producer.setNamesrvAddr("localhost:9876&q…

复现Nginx 解析漏洞

目录 漏洞原理 漏洞复现 编译环境 制作图片马 一&#xff1a;随便弄一张图片 二&#xff1a;准备写一个.php文件&#xff0c;写上木马 三&#xff1a;合成图片马 上传图片马 修复漏洞 漏洞原理 1、 由于nginx.conf的如下配置导致nginx把以’.php’结尾的文件交给fast…

一篇文章告诉你金融行业如何高效管理文件

由于金融行业的行业属性&#xff0c;信息安全万分重要。因此在文件管理工具时&#xff0c;要注意数据安全问题&#xff0c;那么金融行业如何高效管理文件呢&#xff1f; 首先金融行业在文件管理时可能面临以下问题&#xff1a; 1&#xff0c;资料繁杂&#xff0c;整理困难&…

Unity Camera -- (3)控制相机能看到的东西

使用剪裁平面&#xff08;Clipping Planes&#xff09;定义相机可视范围 Clipping Planes定义了相机所能看到的场景范围。在有些时候&#xff0c;限制相机所能看到的范围是出于风格上的考量&#xff0c;但编辑Clipping Planes的主要目的是为了优化性能。相机所需要渲染的东西越…

什么是低码平台?低代码平台能解决什么问题?

低代码平台是近年来日益流行的一种新型软件开发工具。它们提供了一种更简单、更快速、更具成本效益的方式来构建和部署定制软件应用程序。在本文中&#xff0c;我们将探讨什么是低码平台&#xff0c;它们可以解决什么问题&#xff0c;以及它们为什么变得如此流行。 一、什么是低…

第十六章 命令模式

文章目录 前言一、命令模式解决智能生活项目设计思想完整代码Command 所有命令的父接口&#xff08;绑定命令都需要实现&#xff09;LightReceiver 命令接受者LightOnCommand / LightOffCommand 将具体的命令进行绑定空命令命令调用者Clint 测试 添加新的命令&#xff0c;非常简…

【信息安全案例】——身份与访问安全(学习笔记)

&#x1f4d6; 前言&#xff1a;一位用户对计算机信息资源的访问活动中&#xff0c;首先必须拥有身份标识&#xff0c;通过该标识鉴别该用户的身份&#xff0c;进一步地&#xff0c;用户还应当具有执行所请求动作的必要权限&#xff0c;系统会验证并控制其能否执行对资源试图完…

Human Pose Regression with Residual Log-likelihood Estimation

Abstract 通过似然热图对输出分布进行建模的基于热图的方法在人体姿态估计领域占据主导地位。相比之下&#xff0c;基于回归的方法更有效&#xff0c;但效果较差。 在这项工作中&#xff0c;我们探索了最大似然估计&#xff08;MLE&#xff09;&#xff0c;以开发一种高效有…

基于朴素贝叶斯的垃圾邮件分类系统项目开发教程

项目资源下载 基于朴素贝叶斯的垃圾邮件分类系统源码 项目简介 本项目基于朴素贝叶斯算法来解决垃圾邮件分类问题&#xff0c;并使用混淆矩阵进行了验证&#xff0c;得到了非常好的准确率和召回率&#xff08;96%和97%&#xff09;。此外还开发了一个可视化的垃圾邮件分类系统…

前端通过ajax上传文件到七牛云

1. 从服务端获取七牛云上传的token,生成token参考官方文档https://developer.qiniu.com/kodo/1208/upload-token 2. 在七牛云文档查找上传的存储区域 https://developer.qiniu.com/kodo/1671/region-endpoint-fq 在七牛云控制台找到空间管理的cdn加速域名https://portal.qiniu…

【Thinkphp 6】框架基础知识

文章目录 环境搭建框架基础规则继承引入单应用模式多应用模式自定义路由调试器空控制器 视图模板引擎安装渲染模板facade代理变量传递view.php语法查看编译后的文件默认值数组按键取值md5加密 请求request信息参数接收生成URL 文件上传上传及验证 验证功能验证器表单令牌 中间件…