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

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


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

马上要面试了,还有八股文没理解?让ChatGPT来给你讲讲吧——如何更好使用ChatGPT?

最近这段时间 ChatGPT 掀起了一阵 AI 热潮&#xff0c;目前来看网上大部分内容都是在调戏 AI&#xff0c;很少有人写如何用 ChatGPT 做正事儿。 作为一个大部分知识都是从搜索引擎和 GitHub 学来的程序员&#xff0c;第一次和 ChatGPT 促膝长谈后&#xff0c;基本认定了一个事…

AI又进化了,突破性革命来了

大家好&#xff0c;我是 Jack。 2023 年&#xff0c;AI 真的杀疯了。短短不到一年的时间&#xff0c;当我们还在感慨 AI 一键生成的二次元画作精美万分的时候&#xff0c;它已经进化到了写实美照也能手到擒来的地步。 更多的效果&#xff0c;可以看刚刚发布的视频&#xff0c;…

爽,我终于掌握了selenium图片滑块验证码

因为种种原因没能实现愿景的目标&#xff0c;在这里记录一下中间结果&#xff0c;也算是一个收场吧。这篇文章主要是用selenium解决滑块验证码的个别案列。 思路&#xff1a; 用selenium打开浏览器指定网站 将残缺块图片和背景图片下载到本地 对比两张图片的相似地方&#x…

十大经典排序算法(上)

目录 1.1冒泡排序 1. 算法步骤 3.什么时候最快 4. 什么时候最慢 5.代码实现 1.2选择排序 1. 算法步骤 2. 动图演示 3.代码实现 1.3 插入排序 1. 算法步骤 2. 动图演示 3. 算法实现 1.4 希尔排序 1. 算法步骤 2. 动图演示 3.代码实现 1.5 归并排序 1. 算法步骤 2…

2023年中国高校计算机大赛-团队程序设计天梯赛(GPLT)上海理工大学校内选拔赛(同步赛) A — E

2023年中国高校计算机大赛-团队程序设计天梯赛&#xff08;GPLT&#xff09;上海理工大学校内选拔赛&#xff08;同步赛) 文章目录A -- A Xor B Problem题目分析codeB -- 吃苹果题目分析codeC -- n皇后问题题目分析codeD -- 分苹果题目分析codeE -- 完型填空题目分析codeA – A…

图像缩放对相机内外参矩阵的影响

参考资料&#xff1a;https://zhuanlan.zhihu.com/p/87185139 一、3D空间中点到图像的投影 设3D空间中的点(x,y,z)(x,y,z)(x,y,z)投影到图像上的像素坐标&#xff08;连续值&#xff0c;以左上角像素的左上角为原点的坐标系&#xff0c;注意与整数值的图像像素索引相区别&…

HTTPS的加密原理(工作机制)

现在很多网站使用的都是HTTPS协议,比如CSDN他们为什么要使用HTTPS协议而不是继续使用HTTP协议呢?以及HTTPS都做了些什么?HTTP协议与HTTPS有哪些区别? 下面我来 讲解这些问题?(篇幅可能有些长,请求耐心观看,我以0基础的角度去讲解这些东西, 如果你有一定的基础前面的跳过就好…

docker安装elasticsearch与head教程完整版—.NET Core Web Api与elasticsearch打造全站全文搜索引擎

默认已经有docker环境 下载与安装 elasticsearch &#xff0c;从hub.docker里面可以看到最新版本的镜像&#xff0c;选择你想要的版本 本教程是以 7.17.7 为案例&#xff0c;为啥不适用最新的&#xff0c;首先个人一般需用最新的版本&#xff0c;如果有亢很难填&#xff0c;其次…

三体到底是啥?用Python跑一遍就明白了

文章目录拉格朗日方程推导方程组微分方程算法化求解画图动图绘制温馨提示&#xff0c;只想看图的画直接跳到最后一节拉格朗日方程 此前所做的一切三体和太阳系的动画&#xff0c;都是基于牛顿力学的&#xff0c;而且直接对微分进行差分化&#xff0c;从而精度非常感人&#xf…

如何用Python求解微分方程组

文章目录odeint简介示例odeint简介 scipy文档中将odeint函数和ode, comples_ode这两个类称为旧API&#xff0c;是scipy早期使用的微分方程求解器&#xff0c;但由于是Fortran实现的&#xff0c;尽管使用起来并不方便&#xff0c;但速度没得说&#xff0c;所以有的时候还挺推荐…

Vite4 + Vue3 + vue-router4 动态路由

动态路由&#xff0c;基本上每一个项目都能接触到这个东西&#xff0c;通俗一点就是我们的菜单是根据后端接口返回的数据进行动态生成的。表面上是对菜单的一个展现处理&#xff0c;其实内部就是对router的一个数据处理。这样就可以根据角色权限或者一些业务上的需求&#xff0…

机器学习入门——线性回归

线性回归什么是线性回归&#xff1f;回归分析&#xff1a;线性回归&#xff1a;回归问题求解单因子线性回归简单实例评估模型表现可视化模型展示多因子线性回归什么是线性回归&#xff1f; 回归分析&#xff1a; 根据数据&#xff0c;确定两种或两种以上变量间相互依赖的定量…

自学大数据第六天~HDFS命令(一)

HDFS常用命令 查看hadoop版本 version hadoop version注意,没有 ‘-’ [hadoopmaster ~]$ hadoop version Hadoop 3.3.4 Source code repository https://github.com/apache/hadoop.git -r a585a73c3e02ac62350c136643a5e7f6095a3dbb Compiled by stevel on 2022-07-29T12:3…

【电赛MSP430系列】GPIO、LED、按键、时钟、中断、串口、定时器、PWM、ADC

文章目录MSP430一、GPIO二、点亮LED三、按键控制LED四、更改主时钟五、串口通信六、串口中断七、外部中断八、定时器九、定时器中断十、PWM十一、ADCMSP430 MSP430 是德州仪器&#xff08;TI&#xff09;一款性能卓越的超低功耗 16 位单片机&#xff0c;自问世以来&#xff0c…

程序员的逆向思维

前要&#xff1a; 为什么你读不懂面试官提问的真实意图&#xff0c;导致很难把问题回答到面试官心坎上? 为什么在面试结束时&#xff0c;你只知道问薪资待遇&#xff0c;不知道如何高质量反问? 作为一名程序员&#xff0c;思维和技能是我们职场生涯中最重要的两个方面。有时候…

【微信小程序】-- 网络数据请求(十九)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &…

到底什么是跨域,如何解决跨域(常见的几种跨域解决方案)?

文章目录1、什么是跨域2、解决跨域的几种方案2.1、JSONP 方式解决跨域2.2、CORS 方式解决跨域&#xff08;常见&#xff0c;通常仅需服务端修改即可&#xff09;2.3、Nginx 反向代理解决跨域&#xff08;推荐使用&#xff0c;配置简单&#xff09;2.4、WebSocket 解决跨域2.5、…

软测面试了一个00后,绝对能称为是内卷届的天花板

前言 公司前段缺人&#xff0c;也面了不少测试&#xff0c;结果竟然没有一个合适的。一开始瞄准的就是中级的水准&#xff0c;也没指望来大牛&#xff0c;提供的薪资也不低&#xff0c;面试的人很多&#xff0c;但平均水平很让人失望。令我印象最深的是一个00后测试员&#xf…

【JavaScript 逆向】百度旋转验证码逆向分析

声明本文章中所有内容仅供学习交流&#xff0c;相关链接做了脱敏处理&#xff0c;若有侵权&#xff0c;请联系我立即删除&#xff01;案例目标爱企查百度安全验证百度搜索&#xff1a;aHR0cHM6Ly93YXBwYXNzLmJhaWR1LmNvbS9zdGF0aWMvY2FwdGNoYS8以上均做了脱敏处理&#xff0c;B…

操作系统(2.2)--进程的描述与控制

目录 二、进程的描述 1.进程的定义和特征 1.1进程的定义 1.2进程的特征 2.进程的基本状态及转换 2.1进程的三种基本状态 2.2 三种基本状态的转换 2.3创建状态和中止状态 3.挂起操作和进程状态的转换 3.1 挂起状态的引入 3.2 引入挂起操作后三个进程状态的转换 …