【Verilog HDL】门级描述 / 数据流描述 / 行为级描述——通过四选一多路选择器,实现对于不同层级描述方式的整体性认知

目录

  • 0 前言
  • 1 输出端口的设计
    • 1.1 门级描述和数据流描述
    • 1.2 行为级描述
  • 2 三种描述方式的整体架构
    • 2.1 门级描述
    • 2.2 数据流描述
    • 2.3 行为级描述
    • 2.4 补充:独立的语句
    • 2.5 小结
  • 3 理解三种描述方式的本质
    • 3.1 门级描述
    • 3.2 数据流描述
    • 3.3 行为级描述
  • 4 理解不同抽象层级描述方式与功能设计之间的联系
    • 4.1 需求分析 & 行为级描述
    • 4.2 求逻辑表达式 & 数据流描述
    • 4.3 画逻辑电路图 & 门级描述
    • 4.4 小结
  • 5 激励块的特殊设置
  • 6 善用科技黑箱:利用行为级描述和集成器件快速完成设计

0 前言

本文从整体上带你完成Verilog HDL语言的三种不同描述方式,让你从宏观上有所把握。

最核心的原则:一切设计实际需求而定,需要存储变量就用reg,需要有符号数就用integer/real/reg signed……

1 输出端口的设计

端口的设计,区别主要在于输出端口是默认的wire还是自定义的reg,本篇将以1位四选一数据选择器为例进行说明。

1.1 门级描述和数据流描述

这两种描述的时候,使用默认的wire即可。

这两种描述方式,本质上都是直接使用逻辑门

  • 门级描述是显式地使用了门级原语
  • 数据流描述其实是隐式地使用门级原语,因为他是直接描述数据在寄存器直接的流动关系,本质上,还是在阐述逻辑门的使用

门级描述与数据流描述,就好比结绳记事使用符号记事的区别,用一连串的符号标志,代替了绳子,减少了许多麻烦。

  • 门级描述是以门级原语为基石的描述方式,必须使用线网类型
  • 数据流描述是以连续赋值语句为基石的描述方式,其左值必须是线网类型,右值无要求。

以下是四选一数据选择器的端口声明,关注output out语句

module choose_4to1(input d0,d1,d2,d3,input add1,add0,output out	// 注意输出端口的设定);endmodule

你需要记住Verilog描述形式
需要记住,门级描述的输出和数据流描述的连续赋值语句的左值,必须是线网类型,所以必须使用默认的输出端口

1.2 行为级描述

行为级描述,输出端口类型应该使用output reg OUT,使用reg类型。

因为过程赋值语句的左值必须是寄存器类型

ANSI C风格的描述如下

module choose_4to1(input d0,d1,d2,d3,input add1,add0,output reg out	// 注意输出端口的设定);endmodule

你也可以将输出端口初始化output reg out = 0

另外一种端口风格,但是不推荐

module choose_4to1(d0,d1,d2,d3,add1,add0,out);input d0,d1,d2,d3;input add1,add0;// 以下两条语句才能将out声明为reg类型的输出端口output out;reg out;endmodule

2 三种描述方式的整体架构

就像盖房子那样,同样是楼房,使用不同的材料,建造的方式不同,速度也不同。

下面我对这几种描述进行一个近似比喻:

  • 门级描述:手里只有基本材料,需要先烧制砖头再盖房子
  • 数据流描述:已经有了现成的砖头,只需要将其以合理的方式组合起来
  • 行为级描述:已经有了集成的房子,只需要拼接起来,就像火神山医院那样

2.1 门级描述

门级原语:andor……

门级描述与门级原语为基本单元

2.2 数据流描述

连续赋值语句:assign

数据流描述以连续赋值语句为基本单元

2.3 行为级描述

结构化过程语句:initialalways

行为级描述以结构化过程语句为基本单元

2.4 补充:独立的语句

独立的语句指的是

  • 输入输出端口的声明,特别的,reg类型输出端口可以定义的时候初始化,但是输入端口不允许
module Example (input a,b,output reg OUT = 0	//【这里是关键点!】);<其他内容>
endmodule
  • 内部线网的设定,可以在定义的时候初始化:wire a = 1;
  • 内部变量的声明,可以在定义的时候初始化:reg b = 0;

2.5 小结

  1. 门级描述:输出部分必须是net类型,门级原语本质是模块实例调用,符合端口连接规则
  2. 数据流描述:左值必须是net类型,右值无要求
  3. 行为级描述:左值必须是reg类型,右值无要求,这里的重点是过程赋值语句的要求,因为它是行为描述的基本单元,就像C语言的变量那样。

3 理解三种描述方式的本质

3.1 门级描述

门级描述,使用门级原语对硬件设计进行描述,它直接反应了逻辑门直接的关系,更加接近底层,接近硬件

3.2 数据流描述

数据流描述,描述了输出数据与输入数据之间的逻辑关系,通过逻辑表达式来建立输入输出数据的联系。

逻辑表达式可以理解为对硬件设计功能的数学表达形式

3.3 行为级描述

行为级描述,直接描述硬件设计所能实现的功能,相当于:设计者告诉软件需要实现怎样的功能,由软件自动生成其门机描述。当然,没有那么智能。

4 理解不同抽象层级描述方式与功能设计之间的联系

此处,我将会以1位四选一数据选择器的设计为例

4.1 需求分析 & 行为级描述

  1. 输入四个数据,从四个里面选择一个:d0,d1,d2,d3
  2. 通过地址控制选择哪个:s1,s0

其行为描述是

  1. 对于输入的数据
  2. 如果地址是00,则输出d0
  3. 否则,如果地址是01,则输出d1
  4. 否则,如果地址是10,则输出d2
  5. 否则,如果地址是11,则输出d3
  6. 否则,输出x

设计块如下:
if语句版本的设计块

module mux_4to1 ( input d0,d1,d2,d3,input s1,s0,output reg out = 0);always @(*)beginif ({s1,s0} == 2'b_00)out = d0;else if ({s1,s0} == 2'b_01)out = d1;else if ({s1,s0} == 2'b_10)out = d2;else if ({s1,s0} == 2'b_11)out = d3;elseout = 1'bx;endendmodule

case语句版本的设计块

module mux_4to1 (input d0,d1,d2,d3,input s1,s0,output reg out = 0);always @(*)begincase({s1,s0})2'b00: out = d0;	// 也可写成【2'd0】2'b01: out = d1;	// 【2'd1】2'b10: out = d2;	// 甚至于你可以直接写【2】2'b11: out = d3;	// 【3】default: $display("错误!\n"); // 千万别忘记这个endcaseendendmodule

激励块如下:

module test4;reg d0 = 0,d1 = 1,d2 = 0,d3 = 1;reg s1,s0;wire out;mux_4to1 MT0 (d0,d1,d2,d3,s1,s0,out);initial$monitor("s1 = %b,  s0 = %b,  out = %b\n",s1,s0,out);initialbegin#1 s1 <= 0; s0 <= 0;#1 s1 <= 0; s0 <= 1;#1 s1 <= 1; s0 <= 0;#1 s1 <= 1; s0 <= 1;endendmodule

输出结果为:
结果
事实上,行为级描述,不仅仅可以适用于1位位宽,更可以直接设置为32位位宽,这是其他描述方式做不到的,他们需要将1位的模块组合成32位的。

4.2 求逻辑表达式 & 数据流描述

  1. 列出真值表
  2. 求逻辑表达式:
    out = (~s1 & ~s0 & d0) | (~s1 & s0 & d1) | (s1 & ~s0 & d2) | (s1 & s0 & d3)

逻辑表达式,表示了输出与输入直接的逻辑关系,可以直接使用数据流描述。

事实上,只有你写得出逻辑表达式,就能使用数据流描述,但是,对于复杂问题往往很难将其逻辑表达式写清楚,并且当今时代有很多集成的模块,完全可以直接调用他们,而没有必要再自己设计,这一点我在后面再进行阐述。

设计块:
逻辑表达式版本的设计块

module mux_4to1(input d0,d1,d2,d3,input s1,s0,output out);assign out = (~s1 & ~s0 & d0) | (~s1 & s0 & d1)  | (s1 & ~s0 & d2)  | (s1 & s0 & d3);endmodule

条件操作符版本的设计块,这个其实已经和行为级描述类似了。

module mux_4to1 (input d0,d1,d2,d3,input s1,s0,output out);assign out = s1? (s0? d3:d2):(s0? d1:d0);endmodule

激励块与仿真结果和行为级一样,不再赘述。

4.3 画逻辑电路图 & 门级描述

  1. 选择器件
  2. 根据逻辑表达式画出逻辑电路图

此处选用基本的逻辑门作为器件。

相比之下,门级描述显得非常复杂,这里不再赘述,请读者自行查阅资料。

当今时代也很少有人再使用门级描述。

4.4 小结

当今时代人们会使用数据流描述和行为级描述,对于某些必要的部分使用门级描述,但是这种情况非常少。

通常我们使用的是RTL级描述,也就是数据流和行为级描述的混合描述方式。

我们来观察两条线对比以下

需求分析___行为级描述
逻辑表达式___数据流描述
逻辑电路图___门级描述

结果显而易见,行为级描述更加简单,提高了效率,但是,由于行为级描述目前没有足够智能,有些事情不能完成,因此我们依然需要数据流描述,但是门级描述几乎已经不需要了。

5 激励块的特殊设置

首先,采用分治思想,将激励块和设计块分开看,激励块的输出显示结果,是由激励信号的类型决定的,在符合端口对接规则的前提下,需要对激励信号的数据类型加以修饰,以达到验证输出结果的目的。

目前我们的激励块是这样是:

reg d0 = 0,d1 = 1,d2 = 0,d3 = 1;
reg s1,s0;
wire out;

如果,我们需要输入的是有符号数,则可以改为reg signed d0;或者integer d0;或者real d0;,请记住,输入端口的reg类型,代表的是一组寄存器类型,而不单单是reg。

如果我们需要输出的结果显示为十进制的负数,则需要设置为wire signed out;,代表其是有符号数。

这也充分体现了开篇所说的:一切设计由需求决定

6 善用科技黑箱:利用行为级描述和集成器件快速完成设计

科技黑箱就是其他设计者已经开发好的功能,你可以直接拿来使用,以提高开发效率。它也可以是C++中的STL库,Python的库等等。

同时,我想你也已经感受到三种描述方式在开发效率方面的差别,多多使用RTL级描述,会大大提高设计者的开发效率。

简而言之,就是把别人做好的东西直接拿来用,帮助你快速完成你设计的东西。

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

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

相关文章

【汇编语言】汇编实验IDE(集成开发环境):RadASM的安装和使用说明

0 前言 本文适合8086CPU的指令集。 对于重要的专业基础课程&#xff0c;汇编语言&#xff0c;做实验是必不可少的&#xff0c;但是由于汇编语言本身的缺陷&#xff0c;现代计算机并不能直接运行汇编语言程序&#xff0c;因此&#xff0c;一般老师会要求我们 使用虚拟机&…

System V IPC之信号灯

信号灯也叫信号量 用于进程/线程同步或互斥的机制 信号灯的类型 1.Posix 无名信号灯 2.Posix 有名信号灯 3.System V 信号灯 信号灯的含义 计数信号灯&#xff08;1和2都是&#xff09; System V信号灯是一个或多个计数信号灯的集合&#xff08;可操作集合中的多个信号灯&…

【VS 2017 C语言 汇编语言】如何使用VS 2017,通过反汇编查看C语言代码对应的32位x86汇编语言 VS 2017单步调试的使用

0 前言 本文适用于VS的大多数版本&#xff0c;本文以VS 2017为例进行讲解。 1 编辑C语言代码 首先&#xff0c;在VS编译器中&#xff0c;创建项目&#xff0c;敲一段C语言代码&#xff0c;这个过程不解释了&#xff0c;如果不会请百度。 #include <stdio.h> #include…

System V IPC之共享内存

共享内存是一种最为高效的进程间通信方式&#xff0c;进程可以直接读写内存&#xff0c; 而不需要任何数据的拷贝 共享内存在内核空间创建&#xff0c; 可以被进程映射到用户空间访问 由于多个进程可同时访问共享内存 &#xff0c; 因此需要同步和互斥机制配合使用 共享内存的使…

【汇编语言】结合C语言,使用VS 2017调试模式下的反汇编工具学习32位x86汇编指令

0 前言 简要说明x86系列指令集的整体概况与变化。 我给到你补充学习内容&#xff1a;使用VS学习汇编语言的教程 1 8086CPU到现代CPU的变化 做一些了解即可&#xff0c;不是绝对的&#xff0c;取决于设计工艺以及用途&#xff0c;不同计算机不一样也正常。 1.1 CPU位数与地…

System V IPC之消息队列

消息队列由消息队列id来唯一标识 消息队列就是一个消息的列表 用户可以在消息队列中添加消息 读取消息 消息队列可以按照类型来发送和接收消息 消息队列使用步骤 打开/创建消息队列 msgget 向消息队列发送消息 msgsnd 从消息队列接收消息 msgrcv 控制消息队列 msgctl 创建/打开…

进程间通信————信号

信号 信号是在软件层次上对中断机制的一直模拟&#xff0c;是一种异步通信方式 linux内核通过信号通知用户进程&#xff0c; 不同的信号类型代表不同的事件 进程对信号有不同的响应方式 缺省方式 忽略信号 捕捉信号 SIGKILL和SIGSTOP这两个信号量 级别很高 只能执行默认操作…

【汇编语言】清华大学学堂在线《汇编语言程序设计》课程学习笔记

0 前言 全是基于x86系列处理器 1 寄存器与存储器的区别 2 汇编程序员眼中的系统结构 指令寄存器 PC&#xff08;Program Counter&#xff09; 指向下一条指令的地址 16位 CS:IP32位 EIP64位 RIP 寄存器与寄存器堆&#xff08;Registers&#xff09; 在处理器内部以名字方…

进程间通信————无名管道

无名管道 只能用于具有亲缘关系的进程之间的通信 单工的通信模式 具有固定的读端和写端 无名管道创建时会返回两个文件描述符 分别用于读写管道 只能用于亲属关系之间 创建无名管道 #include <unistd.h> int pipe(int pfd[2]) 成功返回0 失败返回EOF pfd包含两个元素的…

什么是计算机思维?2个简单表达式让你理解!

0 前言 本文以十进制整数为例&#xff0c;使用2个最简单的表达式char a -20;和char c a b;,为你深入浅出地讲解计算机思维&#xff0c;力求将抽象的计算机思维具象化讲解&#xff0c;同时&#xff0c;我将为你描述一个宏大的计算机世界的蓝图。 计算机思维与核心思想概要&a…

进程间通信————有名管道

有名管道 特点&#xff1a; 对应管道文件 可用于任意进程之间进行通信 打开管道时 可指定读写方式 通过文件I/O操作 内容存放在内存中 当读端和写端都不存在 管道内容自动释放 当读端和写端只存在一个 将会无法打开管道文件 管道文件大小永远为0 因为管道中的内容保存在内…

【汇编语言】8086汇编的loop循环与[bx]寻址(王爽第五章5.5节学习笔记)

计算FFFF:0 ~ FFFF:B单元中数据的和&#xff0c;结果存储到dx中 1 分析与解决 内存单元&#xff1a;字节型数据目标寄存器&#xff1a;dx&#xff0c;字型寄存器&#xff0c;不匹配数据范围&#xff1a;dx不会超&#xff0c;但是dl会超&#xff0c;因此必须用dx将字节型数据&a…

Linux下数据库(sqlite3)学习笔记

sqlite3 数据库安装 1. 本地安装 sudo dpkg -i *.deb 2.在线安装 sudo apt-get install sqlite3 3.使用压缩包解压 压缩包下载路径&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1xHLZGObQODUGBReNEi3KKQ 提取码&#xff1a;zjqv SQLITE3 基本命令 两种命令 1.以…

signal------SIGCHLD

因为笔者之前的文章里面有错误&#xff0c;今天发现&#xff0c;立马做个修改。在下面我的一段关于sigchld信号相对于直接调用wait函数的好处时&#xff0c;我说调用wait函数要一直检测子进程是否执行完其实是错误的&#xff0c; wait是阻塞函数&#xff0c;当主进程调用wait函…

为什么要学习汇编语言?如何正确学习汇编语言?

汇编语言是计算机系统结构的接口&#xff0c;它介于软硬件之间&#xff0c;学习的时候&#xff0c;必须结合软件和硬件来学习。 1 向上结合高级语言 学习汇编语言的时候&#xff0c;不可孤立学习汇编语言&#xff0c;当今时代很少之间用到汇编语言编程&#xff0c;但是使用汇…

数据库Sqlite3

sqlite3 数据库安装 1. 本地安装 sudo dpkg -i *.deb 2.在线安装 sudo apt-get install sqlite3 SQLITE3 基本命令 两种命令 1.以 . 开头的称之为系统命令 .help 帮助 .quit 退出 .exit 退出 .databases 查看打开的数据库&#xff08;显示数据库的名字和路径&#xff…

【汇编语言】8086汇编,快速搞定各种寻址方式:立即数寻址 / 寄存器寻址 / 存储器寻址

0 前言 众所周知&#xff0c;对于8086汇编语言&#xff0c;有几大寻址方式&#xff0c;不过我觉得这个好墨迹&#xff0c;会用就可以了&#xff0c;为什么命名这么多&#xff0c;这次只说本质&#xff0c;不说命名&#xff0c;至于命名&#xff0c;还是得知道&#xff0c;毕竟…

【数据库】数据库基本概念:数据库管理系统 / 数据库 / 表 / 数据

0 前言 本文讲解数据库的最基本概念 推荐书籍&#xff1a;《MySQL 必知必会》 需要的软件&#xff1a;MySQL 8.0 1 数据库相关概念及其实战应用 1.1 数据&#xff08;Data&#xff09; 在人类世界中&#xff0c;数据可以是 数值型数据 十进制数 非数值型数据 图片声音视频文…

tiny4412初期环境搭建

花了整整三天 从跃跃欲试到失望 绝望 最后迎来曙光!!! 话不多说直接上干货 这些软件安装的具体过程网上有很多 在这里就不说了 1.在主机下 安装secureCRT软件和超级终端&#xff08;安一个就行 不过最好两个都安上&#xff09; 作用&#xff1a; 软件可以打印一些开发板信息…

vivado软件如何查看内部器件的仿真信号

有时候&#xff0c;我们需要查看内部模块的信号&#xff0c;那么&#xff0c;在vivado软件该如何操作呢&#xff1f; 运行仿真&#xff0c;可以得到这个界面&#xff0c;之后看左侧部分&#xff0c;可以查看内部的模块。 例如单击rom0 可以看见其内部信号&#xff0c;然后在想…