当前位置: 首页 > news >正文

Verilog实现组合逻辑电路

在verilog 中可以实现的数字电路主要分为两类----组合逻辑电路和时序逻辑电路。

组合逻辑电路比较简单,仅由基本逻辑门组成---如与门、或门和非门等。当电路的输入发生变化时,输出几乎(信号在电路中传递时会有一小段延迟)立即就发生变化。

相反,时序逻辑电路使用时钟且必须要触发器等存储元件,所以其输出变化与电路时钟同步,不是即时变化的。

这篇文章将讨论如何使用 assign 关键字在 verilog 中实现连续赋值(continuous assignment),以及使用连续赋值语句实现基本逻辑门和多路选择器。

1、Verilog 中的连续赋值(Continuous Assignment

设计者可以使用连续赋值语句将数据驱动到设计中的net类型中。因此,连续赋值语句经常被用来实现组合逻辑电路。

实际上可以使用两种不同的方法在verilog中实现连续赋值。第一个被称为显式(explicit)连续赋值,这是verilog中最常用的连续赋值方法;此外还可以使用隐式(implicit)连续赋值,或者叫:net声明赋值。这种方法不太常见,但它要写的代码更少。

1.1、显式连续赋值(Explicit Continuous Assignment

使用assign关键字进行连续赋值的方法被称为显式连续赋值。下面的 verilog 代码展示了使用 assign 关键字进行连续赋值的一般语法。

assign <variable> = <value>;

<variable> 是要为其分配数据的信号的名称,只能使用连续赋值的方式来给net类型的变量赋值。

<value> 可以是一个固定值或者是某个表达式,在此表达式中可以使用变量或net类型。

使用连续赋值时,只要 <value> 中的一个信号改变状态,<variable> 值就会立即发生改变。

下面的代码片段展示了一个最基本的 verilog 连续赋值示例。在该示例中,只要 b 信号改变状态,a 的值就会立即更新,使其等于 b。

assign a = b;

1.2、线网声明赋值(Net Declaration Assignment

设计者还可以在 verilog 设计中使用隐式连续赋值,这种方法通常也被称为线网(net)声明赋值。使用线网声明赋值时,只需要在声明信号的语句中写一条连续赋值语句,这可以减少代码行数。

在 verilog 中使用线网声明赋值时,需要在声明信号时使用 = 符号为信号赋值。下面的代码片段展示了线网声明赋值的一般语法。

<type> <variable> = <value>;

<variable>和<value>使用方法与显式连续赋值中一致。

下面的 verilog 代码展示了如何使用线网声明赋值将 b 的值赋给信号 a。

wire a = b;

2、 在Verilog 中实现组合逻辑电路

使用连续赋值语句和运算符,即可实现基本的组合逻辑电路。

下图是一个3输入与门的示例:

为了在 verilog 中实现该电路,可以使用 assign 关键字将数据驱动到 and_out 输出。这意味着 and_out 信号必须声明为net(线网)类型,例如wire ,然后可以使用按位与运算符 (&) 来实现基本的与门。

下面的代码片段展示了如何实现这个3输入与门。

assign and_out = a & b & c;

这个例子展示了在 verilog 中设计基本的组合逻辑电路是多么的简单。如果设计者需要更改逻辑门的功能,只需要使用不同的verilog运算符即可。又或者设计者需要构建更复杂的组合逻辑电路,那么也可以混合使用不同的位运算符。为了证明这一点,将以下面的电路作为示例。

要在 verilog 中实现电路,需要混合使用按位与 (&) 运算符按位或 (|) 运算符。下面的代码片段展示了如何在 verilog 中实现这一点。

assign logic_out = (a & b) | c;

这段代码同样不难理解。但是设计者需要确保使用了括号来实现复杂的逻辑电路。这不仅可以确保电路正常运行,还可以让代码更易于阅读和维护。

2.1、在 Verilog 中实现多路选择器(Multiplexors

多路选择器是组合逻辑电路中一个常用的组件。在 verilog 中,设计者可以通过多种方式实现这些组件,其中一种方法使用称为always块(always block)的结构,此语法通常被用来实现时序逻辑电路,但同时也可以实现组合逻辑电路。

2.1.1、Verilog 条件运算符

verilog中有一个与C语言等编程语言类似功能的条件运算符。要使用条件运算符,需要在 ? 表达式前写一个逻辑表达式,然后判断它是真还是假。根据表达式的真假,将两个值中的某一个赋值给输出。

下面的 verilog 代码展示了条件运算符使用的一般语法。

output = <expression> ? <value if true> : <value if false>;

接下来看一个简单的 2选1的多路选择器的例子,如下面的电路图所示。

下面的代码片段清楚地展示了如何使用条件运算符在 verilog 中实现上图中的多路选择器。

assign q = addr ? b : a;

2.1.2、嵌套的条件运算符(Nested Conditional Operators

虽然这并不常见,但设计者也可以使用嵌套的条件运算符(Nested Conditional Operators)来编写代码,以实现更大的多路选择器。

接下来将以一个4选1多路选择器为例进行说明,如下图电路所示。

为了使用条件运算符在 verilog 中实现此电路,可以将该多路选择器视为一对2选1的多路选择器。这意味着其中一个多路选择器将在输入 A 和 B 之间进行选择,而另一个多路选择器则在输入 C 和 D 之间进行选择。这两个多路选择器都使用地址信号的 LSB 作为地址引脚。

assign mux1 = addr[0] ? b : a;
assign mux2 = addr[0] ? d : c;

要实现完整的4选1多路选择器,还需要另一个多路选择器。这个多路选择器将前两个多路选择器的输出作为输入,并使用地址信号的 MSB 在它们之间进行选择。

下面的代码片段展示了实现该功能的方法。

assign q = addr[1] ? mux2 : mux1;

此代码使用了在上一个示例中定义的信号 mux1 和 mux2,但其实设计者也可以从此代码中删除 mux1 和 mux2 信号,作为替代使用嵌套的条件运算符,这可以有效地减少代码行数。

下面的代码片段展示了如何做到这一点。

assign q = addr[1] ? (addr[0] ? d : c) : (addr[0] ? b : a);

从这个例子也可以看出,使用条件运算符在 verilog 中实现多路选择器时,代码会变得难以阅读和理解。因此,设计者最好只使用这种方法来实现小型的多路选择器。

2.1.3、用数组(Arrays)作为多路选择器

设计者也可以使用verilog中的数组来构建简单的多路选择器。为此,可以将所有多路选择器的输入组合成一个数组,并使用地址指向数组中的元素。

为了更好地了解它是如何在实践中运用的,仍然以一个4选1的多路选择器为例。

首先需要将输入信号组合成一个数组,有两种方式可以做到这一点。第一种:先声明一个数组,然后给数组中的每一位赋值,如下面的 verilog 代码所示。

assign in_vec[0] = a;
assign in_vec[1] = b;
assign in_vec[2] = c;
assign in_vec[3] = d;

第二种:可以使用verilog中的拼接运算符 { },这样就可以在一行代码中对整个数组赋值----使用一对花括号 { } 并在其中列出希望包含在数组中的所有元素。在使用拼接运算符时,如果是使用的net类型,那么也可以在一条语句中声明和赋值。

下面的 verilog 代码展示了如何使用拼接运算符来对数组赋值。

assign in_vec = {d, c, b, a};        //赋值
wire [3:0] in_vec = {d, c, b, a};    //声明+赋值

由于 verilog 是一种弱类型(Loosely Typed Language)语言,所以也可以使用两位地址信号,就好像它是一个integer类型一样,然后该信号将被用作确定选择4个元素中的哪一个的指针。

下面的代码片段展示了如何实现这种方法。由于多路选择器的输出是wire类型,所以必须在这种情况下使用连续赋值。

assign mux_out = in_vec[addr];

  • 📣您有任何问题,都可以在评论区和我交流📃!

  • 📣本文由 孤独的单刀 原创,首发于CSDN平台🐵,博客主页:wuzhikai.blog.csdn.net

  • 📣您的支持是我持续创作的最大动力!如果本文对您有帮助,还请多多点赞👍、评论💬和收藏⭐!


相关文章:

Verilog实现组合逻辑电路

在verilog 中可以实现的数字电路主要分为两类----组合逻辑电路和时序逻辑电路。组合逻辑电路比较简单&#xff0c;仅由基本逻辑门组成---如与门、或门和非门等。当电路的输入发生变化时&#xff0c;输出几乎&#xff08;信号在电路中传递时会有一小段延迟&#xff09;立即就发生…...

2023前端菜鸟笔试血泪史html5-one--找到工作前都更新

1.说说对html语义化的理解 什么的HTML语义化&#xff0c;顾名思义&#xff0c;HTML语义化就是可以不通过了解HTML的内容&#xff0c;就可以知道这个部分所代表的的意义。 HTML语义化的意义&#xff1a;在使用HTML标签构建页面时&#xff0c;避免大篇幅的使用无语义的标签。 …...

蓝牙调试工具集合汇总

BLE 该部分主要分享一下常用的蓝牙调试工具&#xff0c;方便后续蓝牙抓包及分析。 目录 1 hciconfig 2 hcitool 3 hcidump 4 hciattach 5 btmon 6 bluetoothd 7 bluetoothctl 1 hciconfig 工具介绍&#xff1a;hciconfig&#xff0c;HCI 设备配置工具 命令格式&…...

Java 获取文件后缀名【一文总结所有方法】

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...

UML常见图的总结

一、概述 UML&#xff1a;Unified Modeling Language&#xff0c;统一建模语言&#xff0c;支持从需求分析开始的软件开发的全过程。是一个支持模型化和软件系统开发的图形化语言、为软件开发的所有阶段提供模型化和可视化支持&#xff0c;包括由需求分析到规格&#xff0c;到…...

WebRTC系列-工具系列之音频相关工具

文章目录 1. audio_util数据格式转换类2. WavFile文件读写类2.1 读取wav文件2.2 写入wav文件这篇文章主要介绍WebRTC中一些音频工具这些,大部分都在 common_audio目录下,这个文件夹下提供音频的大量算法,包括sinc重采样算法,音频数据格式的转换:例如 float转int16_t格式等…...

7 线性回归及Python实现

1 统计指标 随机变量XXX的理论平均值称为期望: μE(X)\mu E(X)μE(X)但现实中通常不知道μ\muμ, 因此使用已知样本来获取均值 X‾1n∑i1nXi.\overline{X} \frac{1}{n} \sum_{i 1}^n X_i. Xn1​i1∑n​Xi​.方差variance定义为&#xff1a; σ2E(∣X−μ∣2).\sigma^2 E(|…...

适合小团队协作、任务管理、计划和进度跟踪的项目任务管理工具有哪些?

适合小团队协作、任务管理、计划和进度跟踪的项目任务管理工具有哪些? 大家可以参考这个模板&#xff1a;http://s.fanruan.com/irhj8管理项目归根结底在管理人、物&#xff0c;扩展来说便是&#xff1a; 人&#xff1a;员工能力、组织机制&#xff1b; 物&#xff1a;项目内…...

从100%进口到自主可控,从600块降到10块,中科院攻克重要芯片

前言 2月28日&#xff0c;“20多位中科院专家把芯片价格打到10块”冲上微博热搜&#xff0c;据河南省官媒大象新闻报道&#xff0c;热搜中提到的中科院专家所在企业为全球最大的PLC分路器芯片制造商仕佳光子&#xff0c;坐落于河南鹤壁。 为实现芯片技术自主可控自立自强&#…...

关于git的一些基本点总结

1.什么是git? git是一个常用的分布式版本管理工具。 2.git 的常用命令: clone&#xff08;克隆&#xff09;: 从远程仓库中克隆代码到本地仓库 checkout &#xff08;检出&#xff09;:从本地仓库中检出一个仓库分支然后进行修订 add&#xff08;添加&#xff09;: 在提交前…...

PyTorch保姆级安装教程

1 安装CUDA1.1 查找Nvidia适用的CUDA版本桌面右键&#xff0c;【打开 NVIDIA控制面板】查看【系统信息】查看NVIDIA的支持的CUDA的版本&#xff0c;下图可知支持的版本是 10.11.2 下载CUDACUDA下载官方网址https://developer.nvidia.com/cuda-toolkit-archive找到适合的版本下载…...

MySQL 上亿大表如何优化?

背景XX 实例&#xff08;一主一从&#xff09;xxx 告警中每天凌晨在报 SLA 报警&#xff0c;该报警的意思是存在一定的主从延迟。&#xff08;若在此时发生主从切换&#xff0c;需要长时间才可以完成切换&#xff0c;要追延迟来保证主从数据的一致性&#xff09;XX 实例的慢查询…...

Git(狂神课堂笔记)

1.首先去git官网下载我们对应的版本Git - Downloading Package (git-scm.com) 2.安装后我们会发现git文件夹里有三个应用程序&#xff1a; Git Bash&#xff1a;Unix与Linux风格的命令行&#xff0c;使用最多&#xff0c;推荐最多 Git CMD&#xff1a;Windows风格的命令行 G…...

「2」指针进阶,最详细指针和数组难题解题思路

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练 &#x1f525;座右铭&#xff1a;“不要等到什么都没有了&#xff0c;才下定决心去做” &#x1f680;&#x1f680;&#x1f680;大家觉不错…...

云服务器是做什么的?云服务器典型的应用场景介绍

云服务器可能是很多企业以及个人上云用户的必选产品了&#xff0c;但是对于初学者或者非专业的用户来说云服务器还是比较陌生的&#xff0c;它到底是干什么的&#xff0c;如此生活中哪些地方可以接触到&#xff0c;这篇文章将详细的介绍云服务器使用的应用场景以及相关的操作 本…...

【论文随笔】Transfer of temporal logic formulas in reinforcement learning

Zhe Xu and Ufuk Topcu. 2019. Transfer of temporal logic formulas in reinforcement learning. In Proceedings of the 28th International Joint Conference on Artificial Intelligence (IJCAI’19). AAAI Press, 4010–4018. 这是一篇将inference和learning结合起来的文章…...

蓝桥杯-货物摆放

蓝桥杯-货物摆放1、题目描述1.1 答案提交1.2 运行限制2、解决方案2.1 方案一&#xff1a;暴力解法(三重循环)2.2 方案二&#xff1a;找出乘机的因子1、题目描述 小蓝有一个超大的仓库&#xff0c;可以摆放很多货物。 现在&#xff0c;小蓝有 n 箱货物要摆放在仓库&#xff0c;每…...

10 种顶流聚类算法 Python 实现(附完整代码)

聚类或聚类分析是无监督学习问题。它通常被用作数据分析技术&#xff0c;用于发现数据中的有趣模式&#xff0c;例如基于其行为的客户群。 有许多聚类算法可供选择&#xff0c;对于所有情况&#xff0c;没有单一的最佳聚类算法。相反&#xff0c;最好探索一系列聚类算法以及每…...

微信小程序第一节 —— 自定义顶部、底部导航栏以及获取胶囊体位置信息。

一、前言 大家好&#xff01;我是 是江迪呀。我们在进行微信小程序开发时&#xff0c;常常需要自定义一些东西&#xff0c;比如自定义顶部导航、自定义底部导航等等。那么知道这些自定义内容的具体位置、以及如何适配不同的机型就变得尤为重要。下面让我以在iPhone机型&#x…...

快速吃透π型滤波电路-LC-RC滤波器

π型滤波器简介 π型滤波器包括两个电容器和一个电感器&#xff0c;它的输入和输出都呈低阻抗。π型滤波有RC和LC两种&#xff0c; 在输出电流不大的情况下用RC&#xff0c;R的取值不能太大&#xff0c;一般几个至几十欧姆&#xff0c;其优点是成本低。其缺点是电阻要消耗一些…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...

计算机基础知识解析:从应用到架构的全面拆解

目录 前言 1、 计算机的应用领域&#xff1a;无处不在的数字助手 2、 计算机的进化史&#xff1a;从算盘到量子计算 3、计算机的分类&#xff1a;不止 “台式机和笔记本” 4、计算机的组件&#xff1a;硬件与软件的协同 4.1 硬件&#xff1a;五大核心部件 4.2 软件&#…...

毫米波雷达基础理论(3D+4D)

3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文&#xff1a; 一文入门汽车毫米波雷达基本原理 &#xff1a;https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...