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

【从零开始学习计算机科学】数字逻辑(五) Verilog HDL语言

【从零开始学习计算机科学】数字逻辑(五) Verilog HDL语言

  • Verilog HDL语言
      • 8位全加器
      • 8位计数器
      • 2位比较器
      • 三态驱动器
    • Verilog HDL模块的结构
      • 模块声明。
      • 端口定义。
      • 信号类型。
      • 功能描述
    • verilog描述级别
    • verilog关键字
    • verilog标识符
    • 编写Verilog HDL源代码的标准
    • 数据类型
      • 常量
      • 变量
        • nets型变量
        • register型变量
        • reg型变量
      • 运算符及表达式
        • 算术运算符
        • 逻辑运算符
        • 位运算符
        • 关系运算符
        • 等式运算符
        • 缩减运算符
        • 移位运算符
        • 条件运算符
        • 位拼接运算符
      • 语句
        • 赋值语句
        • 块语句
          • 顺序块
          • 并行块
        • 条件语句
          • if-else语句
          • case语句
        • 循环语句
          • for语句
          • repeat语句
          • forever语句
        • 结构说明语句
          • always
          • initial
          • task和function语句
        • 预编译语句
          • define语句
          • include语句
          • timescale语句
    • 语句的顺序执行与并行执行
      • 语句的顺序执行
    • 设计技巧

Verilog HDL语言

Verilog HDL程序是由模块构成的。每个模块嵌套在module和endmodule声明语句中。模块是可以进行层次嵌套的。每个Verilog HDL源文件中只准有一个顶层模块,其他为子模块。每个模块要进行端口定义,并说明输入输出端口,然后对模块的功能进行行为逻辑描述。程序书写格式自由,一行可以写几个语句,一个语句也可以分多行写。除了endmodule语句、begin/end语句和fork/join语句外,每个语句和数据定义的最后必须有分号。可用 / ∗ . . . . . ∗ / /*.....*/ /...../ / / . . . //... //...对程序的任何部分作注释。加上必要的注释,以增强程序的可读性和可维护性。

以下为verilog实例代码

8位全加器

		module  adder8 ( cout,sum,a,b,cin ); 	output  cout; 		// 输出端口声明output [7:0] sum; input [7:0] a,b; 		// 输入端口声明input   cin;				assign {cout,sum}=a+b+cin;	endmodule

8位计数器

		module  counter8 ( out,cout,data,load, cin,clk ); 	output [7:0] out;output  cout; 			input [7:0] data; 			input load, cin,clk ;				reg[7:0] out; always @(posedge clk)beginif(load)out = data;                     // 同步预置数据elseout = out + 1 +  cin;      // 加1计数endassign cout = &out & cin;   //若out为8‘hFF,cin为1,则cout为1endmodule

2位比较器

		module  compare2 ( equal,a,b); 	output equal;input [1:0] a,b; 			assign equal = ( a = = b ) ? 1:0;/ * 如果a等于b,则equal 为1,否则为0 * /	endmodule

三态驱动器

module  trist1(out,in,enable);output  out;input   in, enable;mytri  tri_inst(out,in,enable);
endmodulemodule mytri(out,in,enable);output  out;input   in, enable;assign out = enable? in:’bz;/ * 如果enable为1,则out = in,否则为高阻态 * /
endmodule

Verilog HDL模块的结构

Verilog的基本设计单元是“模块 (block) ”。Verilog 模块的结构由在module和endmodule关键词之间的4个主要部分组成:

模块声明。

模块声明包括模块名字和模块输入、输出端口列表。其格式如下:

     module  模块名 (端口1,端口2,端口3……);…….endmodule。

端口定义。

端口是模块与外界或其他模块连接和通信的信号线,有三种类型的端口:输入端口(input)、输出端口(output)和输入/输出端口(inout)。对模块的输入、输出端口要明确说明,其格式为:

Input   端口1,端口2,….端口N;      //输入端口output   端口1,端口2,….端口N;     //输出端口Inout    端口1,端口2,….端口N;     //双向端口

信号类型。

对端口的输入输出要明确说明外,还要进行信号数据类型的定义。Verilog语言提供了各种信号类型,分别模拟实际电路中的各种物理连接和物理实体。常用的数据类型包括连线型(wire)、寄存器型(reg)两种。如果信号的数据类型没有定义,则综合器将其默认为wire型。需要注意的是,输入和双向端口不能声明为寄存器型。定义信号数据类型举例:

reg    cout;            //定义信号cout数据类型为reg型wire   a,b,c;      //定义信号a,b,c数据类型为wire(连线)型

功能描述

在Verilog 模块中有多种方法可以描述电路的逻辑功能:

(1)用assign 语句。assign x = ( b &   c ) ( b \& ~c ) (b& c)

(2)用元件例化(instantiate)。调用元件方法类似于在电路图输入方式下调入图形符号来完成设计,这种方法侧重于电路的结构描述。在Verilog语言中,可通过调用如下元件的方式来描述电路的结构:1.调用Verilog内置门元件(门级结构描述);2.调用开关级元件(开关级结构描述);3.用户定义元件UDP(也在门级)。

一个模块可以通过模块名及端口说明使用另一个模块。实例化模块时不需要知道其实现细节。这正是自上而下设计方法的一个重要特点。模块的实现可以是行为级也可以是门级,但并不影响高层次模块对它的使用。

需要注意的是,模块实例化时实例必须有一个名字。在使用位置映射时,端口次序与模块的说明相同。在使用名称映射时,端口次序与位置无关。对于没有连接的输入端口,初始化值为x。

(3)用 “always” 块语句。“always” 块语句常用于描述时序逻辑,也可描述组合逻辑。“always” 块可用多种手段来表达逻辑关系,如用if-else语句或case语句。

“always” 块语句与assign语句是并发执行的, assign语句一定要放在“always” 块语句之外。

Verilog模型可以是实际电路不同级别的抽象。所谓不同的抽象级别,实际上是指同一个物理电路,可以在不同的层次上用Verilog语言来描述它,如果只从行为和功能的角度来描述某一电路模块,就称为行为模块;如果从电路结构的角度来描述该电路模块,就称为结构模块。抽象的级别和它们对应的模块类型常可以分为以下5种:(1) 系统级(system)、(2) 算法级(algorithmic)、(3) RTL级(RegisterTransferLevel)、(4) 门级(gate-level)、(5) 开关级(switch-level)。其中,系统级、算法级和RTL级是属于行为级的,门级是属于结构级的。而Verilog既是一种行为描述的语言也是一种结构描述语言。

Verilog模型可以是实际电路的不同级别的抽象。这些抽象的级别包括:系统说明、设计文档/算法描述、RTL/功能级、门级/结构级、版图/物理级。

Verilog可以在三种抽象级上进行描述:

行为级抽象。用功能块之间的数据流对系统进行描述,在需要时在函数块之间进行调度赋值。

RTL级/功能级抽象。用功能块内部或功能块之间的数据流和控制信号描述系统,基于一个已定义的时钟的周期来定义系统模型。

结构级/门级抽象。用基本单元(primitive)或低层元件(component)的连接来描述系统以得到更高的精确性,特别是时序方面。在综合时用特定工艺和低层元件将RTL描述映射到门级网表。

设计工程师在不同的设计阶段可以采用不同的抽象级。比如,首先在行为级描述各功能块,以降低描述难度,提高仿真速度。在综合前将各功能模块进行RTL级描述。用于综合的库中的大多数单元采用结构级描述。在结构级描述部分将对结构级(门级)描述进行更详细的说明。
除此之外,Verilog还有一定的晶体管级描述能力及算法级描述能力。

前面提到的所谓逻辑综合就其实质而言是设计流程中的一个阶段,在这一阶段中将较高级抽象层次的描述自动地转换成较低层次描述。就现在达到的水平而言,所谓逻辑综合就是通过综合器把HDL程序转换成标准的门级结构网表,而并非真实具体的电路。而真实具体的电路还需要利用ASIC和FPGA制造厂商的布局布线工具根据综合后生成的标准的门级结构网表来产生。为了能转换成标准的门级结构网表,HDL程序的编写必须符合特定综合器所要求的风格。由于门级结构、RTL级的HDL程序的综合是很成熟的技术,所有的综合器都支持这两个级别HDL程序的综合。

对于数字系统的逻辑设计工程师而言,熟练地掌握门级、RTL级、算法级、系统级是非常重要的。而对于电路基本部件(如门、缓冲器、驱动器等)库的设计者而言,则需要掌握用户自定义源语元件(UDP)和开关级的描述。

一个复杂电路的完整Verilog HDL模型是由若干个Verilog HDL模块构成的,每一个模块又可以由若干个子模块构成。这些模块可以分别用不同抽象级别的Verilog HDL描述,在一个模块中也可以有多种级别的描述。利用Verilog HDL语言结构所提供的这种功能就可以构造一个模块间的清晰层次结构来描述极其复杂的大型设计。

模块内具体逻辑行为的描述方式又称为建模方式。根据设计的不同要求,每个模块内部具体的逻辑行为描述方式可以分为四个不同的抽象级别。
对于外部来说,看不到逻辑行为的具体实现方式。因此,模块的内部具体逻辑行为描述相对于外部其它模块来说是不可见的。
改变一个模块内部逻辑行为的描述方式,并不会影响该模块与其它模块的连接关系。

Verilog HDL提供了下面四种方式描述具体的逻辑行为:

行为级描述方式。Verilog HDL的行为级描述是最能体现电子设计自动化风格的硬件描述方式,它既可以描述简单的逻辑门,也可以描述复杂的数字系统乃至微处理器;既可以描述组合逻辑电路,也可以描述时序逻辑电路。因此,它是Verilog HDL最高抽象级别的描述方式。其可以按照要求的设计算法来实现一个模块,而不用关心该模块具体硬件实现的细节。这种抽象级别描述方式非常类似c编程。一般行为级描述用于对设计进行仿真研究。

数据流描述方式。数据流描述方式,也称寄存器传输级(Register Transfer,RTL)描述方式。所谓的数据流描述可以这样理解,即在一个复杂的数字系统中,应该包含有数据流和控制流。控制流用于控制数据的“流向”,即:数据将要到达的地方。从寄存器传输级的角度,可以这样理解,即在寄存器之间插入组合逻辑电路。在一个复杂的数字系统中,任何数据从输入到输出,都需要经过寄存器,寄存器用于重定序和记忆。
行为级描述方式到底和数据流描述方式的本质区别在什么地方?
下面对其进行分析:行为级描述中,包含一些设计元素,在FPGA内无法找到相应的逻辑单元来实现这些设计元素。而数据流描述中,只包含可以在FPGA内实现的设计元素。行为级描述,一般只用于对设计进行仿真,也就是生成对设计的测试向量,通过特定的仿真软件来测试设计有无设计缺陷。但是,不能转换成FPGA的具体物理实现。而数据流描述,用于对设计进行综合,最后下载到FPGA器件进行具体的物理实现。

结构级描述方式。结构描述就是在设计中,通过调用库中的元件或者是已经设计好的模块来完成设计实体功能的描述。通常情况下,在使用层次化设计时,一个高层次模块会调用一个或者多个低层次模块。这种模块的调用是通过模块例化语句实现的。

开关级描述方式。从本质上来说,开关级属于结构化描述方式,但是其描述更接近于底层的门级和开关级电路。这里突出说明开关级描述方式,是为了说明Verilog HDL对底层强大的描述功能。

逻辑电路的设计块完成后,就要测试这个设计块描述的逻辑功能是否正确。为此必须在输入端口加入测试信号,而从其输出端口检测其结果是否正确,这一过程常称为搭建测试台 test bench 。根据仿真软件的不同,搭建测试平台的方法也不同。
测试台 (test bench) 提供测试激励及验证机制。

Test bench 使用行为级描述。

相关文章:

【从零开始学习计算机科学】数字逻辑(五) Verilog HDL语言

【从零开始学习计算机科学】数字逻辑(五) Verilog HDL语言 Verilog HDL语言8位全加器8位计数器2位比较器三态驱动器Verilog HDL模块的结构模块声明。端口定义。信号类型。功能描述verilog描述级别verilog关键字verilog标识符编写Verilog HDL源代码的标准数据类型常量变量nets…...

从零开始实现大语言模型(十三):预训练大语言模型GPTModel

1. 前言 使用梯度下降算法通过下一个token预测任务预训练大语言模型GPTModel,前向传播流程每次会输入一个batch的长度均为context_len的训练样本,执行 batch_size context_len \text{batch\_size}\times\text{context\_len} batch_sizecontext_len次下…...

Permute for Mac v3.12.1 文件格式转换器 支持M、Intel芯片

Mac毒搜集到的Permute 提供简单的视频格式转换功能,可以简单的将视频文件转换为你想要的格式。将你想要转换的视频拖到软件窗口内,然后选择你想要转换的格式即可。 应用介绍 Permute是一款Mac上易用的媒体格式转换工具,支持视频、音乐和图像…...

DeepSeek group-limited expert routing和负载均衡

Ref https://github.com/deepseek-ai/DeepSeek-V3/blob/main/inference/model.py GitHub - deepseek-ai/EPLB: Expert Parallelism Load Balancer DeepSeek-V3 Technical Report DeepSeek的路由方法 class Gate(nn.Module):def __init__(self, args: ModelArgs):super().__…...

智慧消防新篇章:4G液位/压力传感器,筑牢安全防线!

火灾无情,防患未“燃”!在智慧消防时代,如何实现消防水系统的实时监测、预警,保障人民生命财产安全?山东一二三物联网深耕物联网领域,自主研发4G液位、4G压力智能传感器,为智慧消防水位、水压无…...

C++ primier plus 函数探幽第二部分

系列文章目录 C primer plus 第一节 步入C-CSDN博客 C primer plus 第二节 hello world刨析-CSDN博客 C primer plus 第三节 数据处理-CSDN博客 C primer plus 第四节 复合类型-CSDN博客 C primer plus 第五节 循环-CSDN博客 C primier plus 第七节 函数探幽第一部分-CSDN博客 …...

DBus名词术语命名规范详解:构建清晰、规范的DBus通信

引言 DBus(Desktop Bus)是一种高效、灵活的进程间通信(IPC)机制,广泛应用于Linux桌面环境中。为了确保DBus通信的清晰性和规范性,DBus定义了一套严格的命名规范,涵盖了总线、服务名、对象路径、…...

用低代码平台集成人工智能:无需专业开发也能实现智能化

引言:人工智能的普及与企业需求 随着人工智能(AI)技术的飞速发展,越来越多的企业开始意识到其在提升运营效率、优化客户体验和推动业务创新方面的巨大潜力。从智能客服到自动化决策支持,从数据分析到个性化推荐&#x…...

Java停车平台高并发抢锁技术方案设计 - 慧停宝开源停车管理平台

Java停车平台高并发抢锁技术方案设计 一、业务场景特征 瞬时流量峰值 早晚高峰时段(07:30-09:00, 17:30-19:00)请求量激增10倍热门商圈停车场每秒并发请求可达5000 QPS 资源竞争特性 单个车位被多人同时抢占(超卖风险)用户操作链…...

C++关键字:typename 用于依赖名消歧器(disambiguator)

目录 1. 说明 2. 示例 1. 说明 在模板(包括别名模板)的声明或定义中,非当前实例的成员且依赖于模板参数的名称不视为类型,除非使用关键字 typename 或除非它已被建立为类型名称(例如使用 typedef 声明或用于命名基…...

第六课:数据库集成:MongoDB与Mongoose技术应用

本文详细介绍了如何在Node.js应用程序中集成MongoDB数据库,并使用Mongoose库进行数据操作。我们将涵盖MongoDB在Ubuntu 20系统中的安装、Bash命令的CRUD操作、Mongoose数据建模(Schema/Model)、关联查询与聚合管道,以及实战案例—…...

TypeError: Cannot set properties of undefined (setting ‘xxx‘)

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 🍚 蓝桥云课签约作者、…...

Gravitino源码分析-SparkConnector 实现原理

Gravitino SparkConnector 实现原理 本文参考了官网介绍,想看官方解析请参考 官网地址 本文仅仅介绍原理 文章目录 Gravitino SparkConnector 实现原理背景知识-Spark Plugin 介绍(1) **插件加载**(2) **DriverPlugin 初始化**(3) **ExecutorPlugin 初始化**(4) *…...

windows下使用msys2编译ffmpeg

三种方法: 1、在msys2中使用gcc编译 2、在msys2中使用visual studio编译(有环境变量) 3、在msys2中使用visual studio编译(无环境变量) 我的环境: 1、msys2-x86_64-20250221 2、vs2015 3、ffmpeg-7.1…...

Linux内核自定义协议族开发指南:理解net_device_ops、proto_ops与net_proto_family

在Linux内核中开发自定义协议族需要深入理解网络协议栈的分层模型。net_device_ops、proto_ops和net_proto_family是三个关键结构体,分别作用于不同的层次。本文将详细解析它们的作用、交互关系及实现方法,并提供一个完整的开发框架。 一、核心结构体的作用与层级关系 struct…...

可视化+图解链表

链表(Linked list)是一种常用的数据结构,它由一系列节点组成,每个节点包含数据域和指针域。指针域存储了下一个节点的地址,从而建立起各节点之间的线性关系。 1、链表节点 1.1 节点构成 链表节点如下图所示&#xff…...

Docker参数,以及仓库搭建

一。Docker的构建参数 注释: 1.对于CMD,如果不想显示,而是使用交互界面:docker run -ti --rm --name test2 busybox:v5 sh 2.对于CMD,一个交互界面只可以使用一个,如果想多次使用CMD,则用ENTR…...

正十七边形尺规作图证明——从高斯的发现到几何实现

正十七边形尺规作图证明——从高斯的发现到几何实现 1. 引言:一个历史性的数学突破 在欧几里得几何中,尺规作图(仅使用直尺和圆规)是最为基础的几何构造方法。古希腊数学家已知如何构造正三角形、正方形和正五边形,但…...

常见Web应用源码泄露问题

文章目录 前言一、常见的源码泄露漏洞git源码泄露SVN源码泄露DS_Store文件泄漏网站备份压缩文件泄露WEB-INF/web.xml泄露CVS泄露.hg源码泄露Bazaar/bzr泄露.swp文件泄露 前言 在Web应用方面对于安全来说,可能大家对SQL注入、XSS跨站脚本攻击、文件上传等一些漏洞已…...

如何使用 Python+Flask+win32print 实现简易网络打印服务1

Python 实现网络打印机:Flask win32print 在工作场景中,我们可能需要一个简单的网页接口,供他人上传文档并自动打印到指定打印机。 本文将演示如何使用 Python Flask win32print 库来实现这一需求。 代码详见:https://github.…...

使用Modelsim手动仿真

FPGA设计流程 在设计输入之后,设计综合前进行 RTL 级仿真,称为综合前仿真,也称为前仿真或 功能仿真。前仿真也就是纯粹的功能仿真,主旨在于验证电路的功能是否符合设计要求,其特点是不考虑电路门延迟与线延迟。在完成一个设计的代码编写工作之后,可以直接对代码进行仿真,…...

DeepSeek、Grok与ChatGPT:AI三巨头的技术博弈与场景革命

## 引言:AI工具的三国杀时代 2025年的AI江湖,DeepSeek以黑马之姿横扫全球应用榜单,Grok 3凭借马斯克的狂言抢占头条,ChatGPT则稳坐行业王座。这场技术竞赛不仅是参数量的比拼,更是一场关于效率、成本与场景适配的终极…...

windows自动锁屏,并且要输入密码。如何取消?

Windows 电脑自动锁屏并需要输入密码,通常是因为系统的 电源和睡眠设置 或 组策略 设定了自动锁屏。你可以按照以下方法取消自动锁屏或去掉密码要求: 方法 1:修改 Windows 设置 取消锁屏时间 Win I 打开 设置,进入 系统 → 电源和…...

Redis 主从复制、哨兵与集群的关系及工作原理详解

一、核心概念与关系 Redis 的 主从复制、哨兵(Sentinel) 和 集群(Cluster) 是逐步演进的高可用与分布式解决方案,三者关系如下: 主从复制:数据冗余与读写分离的基础。 哨兵:在主从…...

XSD 对 XML 数据格式验证 java

xsd文件&#xff0c;文件名bean.xsd&#xff0c;放在当前java文件目录下 <?xml version"1.0" encoding"UTF-8"?> <xs:schema xmlns:xs"http://www.w3.org/2001/XMLSchema"><xs:element name"bean"><xs:comple…...

利用 ArcGIS Pro 快速统计省域各市道路长度的实操指南

在地理信息分析与处理的工作中&#xff0c;ArcGIS Pro 是一款功能强大的 GIS 软件&#xff0c;它能够帮助我们高效地完成各种复杂的空间数据分析任务。 现在&#xff0c;就让我们一起深入学习如何借助 ArcGIS Pro 来统计省下面各市的道路长度&#xff0c;这一技能在城市规划、…...

1.4 单元测试与热部署

本次实战实现Spring Boot的单元测试与热部署功能。单元测试方面&#xff0c;通过JUnit和Mockito等工具&#xff0c;结合SpringBootTest注解&#xff0c;可以模拟真实环境对应用组件进行独立测试&#xff0c;验证逻辑正确性&#xff0c;提升代码质量。具体演示了HelloWorld01和H…...

蓝桥杯备考:六级词汇积累(day5)

dense 稠密的 condense 压缩 compassion 同情&#xff0c;怜悯 compact 紧凑的&#xff0c;紧密的 resent 愤恨 sober 清醒的 sole 唯一的&#xff0c;独占的 solely only solemn 表情严肃的&#xff0c;庄重的 stun 使昏迷 Stunned by the impact, he lay on the ground won…...

掌握Kubernetes Network Policy,构建安全的容器网络

在 Kubernetes 集群中&#xff0c;默认情况下&#xff0c;所有 Pod 之间都是可以相互通信的&#xff0c;这在某些场景下可能会带来安全隐患。为了实现更精细的网络访问控制&#xff0c;Kubernetes 提供了 Network Policy 机制。Network Policy 允许我们定义一组规则&#xff0c…...

结合rpart包的决策树介绍

决策树与CART算法 决策树是一种基于树状结构的监督学习算法。它通过从根节点开始递归地对特征进行划分&#xff0c;构建出一棵树来进行决策。决策树的构建过程需要解决的重要问题有三个&#xff1a;如何选择自变量、如何选择分割点、确定停止划分的条件。解决这些问题是希望随…...