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

这篇具有很好参考价值的文章主要介绍了FPGA入门系列5--运算符号。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

文章简介

本系列文章主要针对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: 

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

代码解析 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--赋值语句文章来源地址https://www.toymoban.com/news/detail-469584.html

到了这里,关于FPGA入门系列5--运算符号的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA信号处理系列文章——深入浅出理解多相滤波器

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 多相滤波是,按照相位均匀划分把数字滤波器的系统函数H(z)分解成若干个具有不同相位的组,形成多个分支,在每个分支上实现滤波。 采用多相滤波结构,可利用多个阶数较低的滤波来实现原本阶数较

    2024年02月05日
    浏览(65)
  • FPGA入门有多难?这篇文章让你吃透零基础入门技巧!

    FPGA是一个高度集成化的芯片,其学习过程既需要编程,又需要弄懂硬件电路和计算机架构。涉及到的知识和基础非常多, 如果不合理地安排学习内容,学习过程会非常漫长和枯燥 。这使很多想要学习FPGA小伙伴望而却步,那么,**FPGA到底有多难入门?**今天移知教育小编就带

    2024年02月04日
    浏览(50)
  • FPGA设计入门:Vivado综合简介

    FPGA设计入门:Vivado综合简介 FPGA是一种基于可编程逻辑器件的数字电路设计技术,可以通过编程实现各种电路功能。Vivado是Xilinx公司推出的一款开发工具,可以用来对FPGA进行综合、布局、布线、生成比特流等操作。本篇文章将从Vivado综合的基本流程入手,详细介绍如何使用

    2024年02月09日
    浏览(43)
  • 谁说配置难?这篇文章让你轻松掌握xilinx 7系列FPGA配置技巧

      本文旨在通过讲解不同模式的原理图连接方式,进而配置用到引脚的含义(手册上相关引脚含义有四、五页,通过本文理解基本上能够记住所有引脚含义以及使用场景),熟悉xilinx 7系列配置流程,以及设计原理图时需要注意的一些事项,比如flash与FPGA的上电时序。   x

    2024年02月06日
    浏览(65)
  • 区块链入门系列文章—solidity中的HelloWord

    本系列教程将从零开始记入笔者学习区块链的过程,欢迎批评指正。 Solidity 的代码都涵盖在智能合约里面. 一个智能合约就是以太坊应用的最小单元, 所有的变量和函数都属于一个智能合约, 它是你所有应用的起点。 代码如下(示例): pragma solidity ^0.4.19; 0.4.19代表的是你使

    2024年02月02日
    浏览(58)
  • API 渗透测试从入门到精通系列文章(下)

    导语:在本系列文章的前面一部分我们从使用 Postman 开始,创建了集合和请求,并通过 Burp Suite 设置为了 Postman 的代理,这样我们就可以使用 Burp 的模糊测试和请求篡改的功能。 在本系列文章的前面一部分我们从使用 Postman 开始,创建了集合和请求,并通过 Burp Suite 设置为了

    2024年02月03日
    浏览(53)
  • 前端新手Vue3+Vite+Ts+Pinia+Sass项目指北系列文章 —— 第一章 技术栈简介 (开篇)

    旨在帮助初学者掌握使用现代前端技术栈构建应用的基础知识和技能。在这个系列中,我们将深入探讨如何结合Vue.js、Vite、TypeScript、Pinia和Sass这些强大的工具和框架来开发现代化的前端应用。 通过这个系列,我们将从零开始构建一个完整的前端项目,覆盖项目初始化、组件

    2024年02月05日
    浏览(49)
  • 快进来,带你了解FPGA基础知识---lattice莱迪斯深力科MachXO2 FPGA系列简介

    FPGA基础知识---lattice莱迪斯深力科MachXO2 LCMXO2-4000HC-4TG144I FPGA简介 FPGA基础知识:FPGA是英文Field-Programmable Gate Array的缩写,即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,

    2024年02月03日
    浏览(41)
  • JavaScript系列从入门到精通系列第九篇:JavaScript中赋值运算符和关系运算符以及Unicode编码介绍

    文章目录 一:赋值运算符 1:= 2:+= 3:-= 4:*= 5:/= 6:%= 二:关系运算符  1:数值类型关系运算 (一): (二):= (三): (四):= 2:其他类型关系运算 三:Unicode编码表         =右侧的值可以赋值给左侧的变量。         上边这两个写法是一样的。                 

    2024年02月08日
    浏览(57)
  • C++软件调试与异常排查从入门到精通系列文章汇总

    本文是 C++软件调试与异常排查从入门到精通系列教程 专栏的导航贴( 点击链接,跳转到专栏主页,欢迎订阅,持续更新… )。 📢 建议在阅读专栏文章时,使用本篇导航文章,本导航文章对专栏中的文章进行了分类与排序,读起来更有条理! 专栏介绍 :根据近几年C++软件

    2023年04月09日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包