FPGA第 8 篇,硬件描述语言Verilog HDL,初识Verilog HDL

news2024/12/29 8:56:40

前言

        我们都知道 FPGA 是一种高度可编程的集成电路,适用于实现各种数字逻辑功能,而 Verilog HDL是一种广泛使用的硬件描述语言(Hardware Description Language, HDL),主要用于数字电子系统的描述、仿真和综合,以及其他数字系统的逻辑设计。通过使用 Verilog,工程师可以高效地设计和验证 FPGA 电路,从而实现所需的数字系统功能。

        这里的 Verilog HDL 和 Verilog 实际上指的是同一种硬件描述语言(Hardware Description Language),即 Verilog。Verilog HDL 是 Verilog 的完整名称,“HDL”代表“Hardware Description Language”,表示这是一种用于描述硬件系统(特别是数字逻辑电路)的语言。

        Verilog 语言最初由 Gateway Design Automation 开发,后来被 Cadence Design Systems 收购,并最终成为了一个开放的标准,Verilog 已经被 IEEE 标准化为 IEEE 1364。它是一种更接近编程语言的 HDL,HDL 是硬件描述语言的总称,包括 Verilog 和 VHDL。


一. Verilog 介绍

        Verilog HDL是一种硬件描述语言,以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。


二. Verilog 优势与特点

1. Verilog 优势

  1. 语法自由、易学易用
  2. 适合算法级、门级设计
  3. 代码简洁
  4. 发展较快
  5. Verilog 的语法风格在一定程度上类似于 C 语言,这使得熟悉 C 语言的开发者能够更快地上手 Verilog。

2. Verilog 特点

  1. 硬件描述:Verilog 提供了一种描述数字电路的方式,包括电路的结构、行为和数据流。

  2. 可综合性:Verilog 代码可以被综合工具转换为实际的硬件电路,如现场可编程门阵列(FPGA)或专用集成电路(ASIC)。

  3. 仿真:Verilog 代码可以被仿真工具用来验证电路的功能正确性。

  4. 模块化设计:Verilog 支持模块化的设计方法,允许将大型设计分解为较小的、可重用的模块。

  5. 并行性:Verilog 语言支持并发执行的概念,使得描述复杂的数字系统变得容易。

  6. 混合语言支持:Verilog 可以与另一种流行的 HDL 语言 VHDL 以及其他语言混合使用。


三. Verilog 组成部分

  1. 模块:Verilog 设计的基本单元是一个模块,每个模块描述了一个独立的功能块。
  2. 端口:模块之间的连接通过端口来实现,端口可以定义为输入、输出或双向。
  3. 数据类型:Verilog 支持多种数据类型,包括位向量、整数、实时和位向量数组。
  4. 连续赋值语句:用于描述组合逻辑电路。
  5. 过程块:用于描述时序逻辑和控制逻辑,可以包含条件语句、循环等结构。
  6. 任务和函数:用于封装常用的操作或计算,提高代码的复用性。


四. Verilog 应用场景

  • IC 设计:Verilog 用于描述和验证 IC 的功能。
  • FPGA 开发:Verilog 用于 FPGA 的设计和配置。
  • 嵌入式系统:Verilog 用于嵌入式系统的硬件部分描述。
  • 系统级仿真:Verilog 可以用于系统级的仿真,包括软硬件协同仿真。


五. Verilog 具体使用

First. Verilog 编辑器

1. Verilog硬件语言,支持的文本编辑器,请看

  1. Notepad++ - 一个免费且强大的文本编辑器,支持语法高亮显示。
  2. VS Code (Visual Studio Code) - 支持多种语言,包括Verilog,并且可以通过扩展增强功能。
  3. Sublime Text - 提供了高度可定制化的环境,有丰富的插件支持。
  4. Atom - 一个开源编辑器,有大量的社区插件可供安装。
  5. Vim 或 Emacs - 对于熟悉命令行界面的用户来说非常强大。

2. 文本编辑器与集成开发环境的区别

(1). 文本编辑器

        文本编辑器是用于编写和编辑代码的工具,通常提供基本的文本处理功能。常见的文本编辑器包括:

  • Notepad++、
  • Visual Studio Code、
  • Sublime Text、

等等。

(2). 集成开发环境(IDE)

        集成开发环境 (IDE) 是一种集成了多个开发工具的综合性开发平台,专门用于设计FPGA开发的IDE通常包括代码编辑、综合(synthesis)、仿真(simulation)、实现(implementation)、调试(debugging)等功能。常见的 FPGA IDE 包括:

  • Intel Quartus Prime、
  • Xilinx Vivado、
  • Lattice Diamond

等等。

容易搞混乱,别搞混了。


Second. Verilog 文件

1. VS Code

  • 这里以VS Code文本编辑器为例,进行开发;
  • 打开VS Code,在插件商店搜索 Verilog-HDL/SystemVerilog/Bluespec SystemVerilog 并下载,这样VsCode就可以识别到 Verilog 代码。

2. 新建文件

  • ​​​​​​打开所选的文本编辑器后;
  • 新建一个空白文件,注意区别文件/文件夹。

3. 保存文件

  • 将文件后缀名改为 .v,例如 my_module.v(Verilog文件的后缀为 .v)。
  • 确保选择合适的文件夹,保存文件。

4. 编写代码

  • 在 Verilog 文件中(后缀名为.v的文件中)输入代码,进行开发。


Third. Verilog 数据类型

        Verilog HDL(Hardware Description Language)支持多种数据类型,这些数据类型可以大致分为两大类:物理数据类型和抽象数据类型。这里是一些常见的Verilog数据类型:

1. 物理数据类型

  • Wire (wire):表示硬件单元之间的物理连线,它不具备存储功能。
  • Tri (tritri0tri1triandtriortrireg):表示三态逻辑门的输出。
  • Reg (reg):表示寄存器或存储单元,可以存储数据。
  • Memory (reg array):使用寄存器数组来模拟存储器。

这些类型主要用于直接映射到硬件电路中的实际组件上。

2. 抽象数据类型

这些类型用于辅助设计和验证过程,通常不直接映射到具体的硬件组件上

  • Integer (integer):用于表示整数。
  • Time (time):用于表示时间值,如仿真时间。
  • Real (real):用于表示实数。
  • Parameter (parameter):用于定义符号常量。
  • Event (event):用于表示事件。
  • String (string):用于表示字符串。

除了上述类型之外,Verilog还支持一些其他的类型,例如:

  • Genvar (genvar):用于生成循环中的索引。
  • Enum (enum):用于定义枚举类型。
  • Struct (struct):用于定义结构体。
  • Union (union):用于定义联合体。

3. 常用的数据类型

        根据资料显示,Verilog HDL共有19种数据类型,其中包括最基本的4种数据类型:integerparameterregwire。除此之外,还有其他如largemediumscalaredsmallvectored等类型,但这些并不是经常使用的类型。

因此,如果只考虑最基本和常用的数据类型,我们可以总结出以下几种:

  1. 连线型 (wire)
  2. 寄存器型 (reg)
  3. 整型 (integer)
  4. 时间型 (time)
  5. 实型 (real)
  6. 参数型 (parameter)
  7. 三态逻辑 (tritri0tri1triandtriortrireg)
  8. 数组类型 (regintegertimerealrealtime 的数组)
  9. 事件 (event)
  10. 字符串 (string)
  11. 枚举 (enum)
  12. 结构体 (struct)
  13. 联合 (union)
  14. 生成变量 (genvar)

        这里需要注意的是,某些类型如tri系列的类型可能不会在所有的Verilog实现中都可用,具体支持哪些类型取决于Verilog的标准版本以及使用的综合工具或仿真器的支持情况。

4. 经常使用的数据类型

(1). wire:用于表示组合逻辑电路中的连线。它没有存储能力,只反映当前时刻的值。

wire out;
assign out = A & B; // 组合逻辑赋值

(2). reg:用于表示寄存器或存储单元。它可以存储值,并且可以在时序逻辑中使用。

reg out;
always @(posedge clk) begin
    if (reset)
        out <= 0;
    else
        out <= A & B;
end

(3) integer:用于表示整数变量,可以存储较大的整数值。

integer i;

(4) time:用于表示时间值,例如在仿真中表示延迟。

time delay_time;

(5) real:用于表示实数变量。

real voltage;

(6) genvar:用于循环生成模块时作为索引。

genvar i;
generate for(i=0; i<4; i=i+1) begin : inst
    // 生成模块实例
end
endgenerate


Fourth. Verilog 逻辑值

1. 二进制逻辑值

  • 1:表示逻辑高电平。
  • 0:表示逻辑低电平。

2. 未知值

  • x 或 X:表示未知的逻辑值,常用于不确定的状态或未初始化的变量。
  • z 或 Z:表示高阻态,通常用于三态门输出或总线的状态。

3. 其它特殊值

  • -:有时也用于表示未知值。
  • ?:表示未知或未指定的值。

4. 常用整合

  1. 0逻辑低电平,条件为假
  2. 1逻辑高电平,条件为真
  3. z:高阻态,无驱动
  4. x:未知逻辑电平

5. 使用示例

        假设我们想要定义一个简单的组合逻辑电路,该电路接收两个输入信号AB,并输出一个与门的结果out

module and_gate(input A, input B, output out);
    assign out = A & B; // 使用二进制逻辑值
endmodule

如果我们要处理不确定的状态,我们可以使用xX来表示未知值。

module unknown_logic(input A, input B, output out);
    assign out = (A & B) | (A & X) | (X & B); // 使用未知值
endmodule

6. 注意事项

  • 在时序逻辑设计中,尽量避免使用wire类型的变量来表示需要存储的值。
  • 当涉及到复杂的逻辑表达式时,合理使用wirereg可以帮助优化设计。
  • 对于未知值和高阻态的处理要特别小心,因为它们可能会导致意想不到的行为。


Fifth. Verilog 算数运算符

        在Verilog HDL中,算术运算符用于执行基本的数学操作,如加法、减法、乘法和除法。这些运算符对于实现数字电路中的算术功能非常重要。这里是Verilog中的一些常见算术运算符及其使用方法:

1. 加法 (+):用于两个数值的加法操作。

reg [3:0] a = 4'b0011;
reg [3:0] b = 4'b0001;
reg [4:0] sum;
assign sum = a + b; // sum 将等于 4'b0100

2. 减法 (-):用于两个数值的减法操作。

reg [3:0] a = 4'b0011;
reg [3:0] b = 4'b0001;
reg [4:0] diff;
assign diff = a - b; // diff 将等于 4'b0010

3. 乘法 (*):用于两个数值的乘法操作。

reg [3:0] a = 4'b0011;
reg [3:0] b = 4'b0001;
reg [7:0] product;
assign product = a * b; // product 将等于 8'b00000011

4. 除法 (/):用于两个数值的除法操作。注意,整数除法会丢弃小数部分。

reg [3:0] a = 4'b0100;
reg [3:0] b = 4'b0010;
reg [3:0] quotient;
assign quotient = a / b; // quotient 将等于 4'b0010

5. 取模 (%):用于求余数。

reg [3:0] a = 4'b0101;
reg [3:0] b = 4'b0011;
reg [3:0] remainder;
assign remainder = a % b; // remainder 将等于 4'b0000

6. 代码示例

这里使用Verilog算术运算符实现一个简单的例子,展示如何实现一个基本的加法器模块:

module adder_module(input [3:0] a, input [3:0] b, output [4:0] sum);
    assign sum = a + b; // 计算 a 和 b 的和
endmodule

Verilog中的算术运算符提供了基本的数学操作,这对于实现数字电路中的算术功能非常重要。在使用这些运算符时,需要注意位宽和溢出等问题。

7. 注意事项

  • 位宽:在进行算术运算时,要注意操作数的位宽。如果位宽不匹配,可能需要使用位拼接 ({}) 或位扩展 ($signed 或 $unsigned) 来调整位宽。
  • 溢出:加法和乘法可能导致溢出,特别是在位宽有限的情况下。Verilog 不会自动处理溢出,因此需要程序员自己处理。
  • 无符号和有符号运算:Verilog 默认使用无符号运算。如果需要有符号运算,可以使用 $signed 函数来明确指定。
  • 类型转换:在不同类型的变量之间进行运算时,可能需要显式转换类型。

Verilog中的算术运算符提供了基本的数学操作,这对于实现数字电路中的算术功能非常重要。在使用这些运算符时,需要注意位宽和溢出等问题。

创作不易,感觉有用,就一键三连,感谢(●'◡'●)

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

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

相关文章

BaseCTF-Web-Week2-WP

目录 1、ez_ser 2、 一起吃豆豆 3、你听不到我的声音 4、Really EZ POP 5、RCEisamazingwithspace 6、以你说你懂 MD5? 7、数学大师 1、ez_ser 简单的 pop 链构造&#xff0c;关于反序列化的魔术方法、 pop 链构造的详细讲解参考我之前的博客&#xff1a; CTF - Web 干…

医生百度百科创建技巧分享

医生百度百科创建技巧分享 #医生百科 #百科创建 百收网SEO&#xff0c;我是一名医生&#xff0c;想要创建百度百科&#xff0c;有没有技巧分享&#xff1f; 当然有了&#xff0c;医生百科审核相对来说比较严格&#xff0c;必须要有医师执业证书才能申请。 掌握下面小技巧&am…

使用Python调用JavaScript进行网页自动化操作

随着互联网技术的飞速发展&#xff0c;网页自动化操作在数据抓取、用户界面测试、内容管理等多个领域变得越来越重要。Python作为一种流行的编程语言&#xff0c;因其简洁的语法和强大的库支持&#xff0c;成为了许多开发者进行网页自动化的首选工具。然而&#xff0c;面对动态…

微信图片过期了怎么恢复?图片过期不愁,4种方法帮您恢复!

微信早已成为我们日常生活中不可或缺的一部分&#xff0c;从日常聊天到分享生活点滴&#xff0c;图片无疑是传递情感与信息的重要载体。然而&#xff0c;偶尔我们会遇到尴尬的情况——那些承载着美好回忆的图片提示“图片已过期或已被清理”。微信图片过期了怎么恢复&#xff1…

FinClip 小程序必备神器

一 背景 从微信17年发布小程序到现在&#xff0c;其平台小程序数量已达到500w&#xff0c;种类和数量都非常大&#xff0c;像小到一个简单的功能&#xff0c;如投票、文字去重、朋友圈防折叠&#xff0c;大到京东、滴滴、餐厅自助点餐&#xff0c;都可以通过小程序实现。可以说…

编程学习中的挫折?那是通往高手的必经之路!从代码小白到坚韧战士!

你是如何克服编程学习中的挫折感的&#xff1f; 在编程学习的征途中&#xff0c;挫折感如同一位不速之客&#xff0c;时常造访我们的学习旅程。它可能源于复杂的算法难题、难以理解的语法规则&#xff0c;或是项目截止日期的紧迫压力。然而&#xff0c;正是这些挑战塑造了更加…

IT管理:我与IT的故事7--如何成为一名强大的售前顾问?

高效售前的“3个标准” 1-客户认可的创新性解决方案 2-通过采用解决方案&#xff0c;客户获得了可度量的业绩与行为改进 3-客户具有能力保持这种改进 1-项目评估 A-业务内涵&#xff1a; 分析企业价值和信息化的核心需求&#xff0c;评估项目可行性及风险&#xff0c;在信息化投…

Python版经典小游戏愤怒的小鸟-Python游戏开发

Python版经典小游戏愤怒的小鸟源代码 如果你正在学习Python&#xff0c;但是找不到方向的话可以试试我这一份学习方法和籽料呀&#xff01;点击 领取籽料&#xff08;不要米米&#xff09; 基于pygamepymunk 程序依赖&#xff1a;pygame2.0.1&#xff0c; pymunk5.5.0 直接运…

Windows提取微信聊天记录,将其导出成HTML、Word、Excel文档永久保存

Windows导出微信消息数据库有两个项目。 一、PyWxDump PyWxDump是一个用于获取 wx 账户信息&#xff08;昵称/账户/电话/电子邮件/数据库密钥&#xff09;、解密数据库、查看 wx 聊天以及将聊天导出为 html 备份的工具。 PyWxDump项目地址 PyWxDump是用Python写的&#xff…

铲屎官快来看,清除浮毛效果很好的宠物空气净化器选购指南

在养宠与育儿并重的现代家庭中&#xff0c;营造一个既温馨又健康的居住环境成为了每位家长的首要任务。宠物&#xff0c;尤其是猫咪和狗狗&#xff0c;作为家庭不可或缺的一员&#xff0c;它们的毛发和身影为生活增添了无限乐趣&#xff0c;但同时也带来了一个不容忽视的挑战—…

C++和QT

什么是QT Qt 是一个跨平台的 C图形用户界面应用程序框架。 它为应用程序开发者提供建立艺术级图形界面所需的所有功能。 它是完全面向对象的&#xff0c;很容易扩展&#xff0c;并且允许真正的组件编程。 QT的优点 跨平台&#xff0c;几乎支持所有的平台 接口简单&#x…

《黑神话:悟空》研发公司的薪资水平

作者&#xff1a;程序员晓凡 最近全网最火爆的要属《黑神话&#xff1a;悟空》了&#xff0c;即便是我这个平时不沾游戏、不追直播的人&#xff0c;也看直播看得津津有味。 一、销量与热度背后 首先&#xff0c;让我们来看看那些令人瞩目的数字。《黑神话&#xff1a;悟空》…

AI米壳:跨境电商必备神器:批量图片翻译!

各位跨境电商的小伙伴们&#xff0c;在我们的电商之路上&#xff0c;是不是常常被产品图片翻译的问题困扰呢&#xff1f; 没错&#xff0c;以往只面对一两张图片时&#xff0c;我们可能会选择在百度上翻译&#xff0c;再用 PS 去除原来的中文文字&#xff0c;添加翻译后的语言到…

第三方软件测评中心分享:科技成果鉴定测试的必要性和流程

在飞速发展的科技时代&#xff0c;科技成果的保护和应用愈发重要&#xff0c;科技成果鉴定测试已经成为衡量和验证项目成功的重要环节。科技成果鉴定测试是指对科技项目成果进行评估、验证和认可的过程。这一过程通常由专家团队主导&#xff0c;旨在确保科技产品或研究成果达到…

Java学习第三天

总体三部分内容&#xff1a;数据类型转换、运算符使用、调用Java提供的程序 数据类型转换&#xff1a; 1.自动类型转换 类型范围小的可以直接转换给类型范围大的变量&#xff1b;例如int类型可以直接赋值为long型 int a 10; long b a; char字符型在计算机底层是一个数字…

SOMEIP_ETS_070: Union_Length_longer_as_mesage_length_allows_it

测试目的&#xff1a; 验证当设备&#xff08;DUT&#xff09;接收到一个联合&#xff08;union&#xff09;长度超出SOME/IP消息长度允许的范围时&#xff0c;是否能够返回错误消息。 描述 本测试用例旨在检查DUT在处理一个echoUNION方法的SOME/IP消息时&#xff0c;如果消…

Apache CloudStack Official Document 翻译节选(十)

关于 Apache CloudStack 的 最佳实践 &#xff08;四&#xff09; 网络流量监测与虚拟机容量规划 客户机网路集成流量监测哨兵 要想搜集客户机网路上的使用数据&#xff0c;就需要从部署在对应网路上的网络统计采集器上拉取数据。通过在Apache CloudStack云上集成流量哨兵便可…

37次8.27(docker03)

1.使用dockerfile创建应用镜像 在Docker file中定义所需要执⾏的指令&#xff0c;使⽤ docker build创建 镜 像&#xff0c;过程中会按照dockerfile所定义的内容进⾏打开临时性容 器&#xff0c;把 docker file中命令全部执⾏完成&#xff0c;就得到了⼀个容器应⽤镜 像&am…

OpenCV4深度神经网络DNN实战教程

OpenCV4深度神经网络DNN实战教程 1-概述与环境配置2-卷积神经网络概述3-加载网络模型与设置3.1 所需的模型下载3.2 所使用的模型&#xff08;googlenet&#xff09;3.3 Net介绍3.4 代码输出网络结构信息3.5 计算后台设置3.6 所有代码 4-图像分类网络inception的使用5-读取分类标…

计算机毕业设计选题推荐-医疗就诊平台-在线医疗问诊系统-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…