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

2024-08-28 20:28

本文主要是介绍FPGA第 8 篇,硬件描述语言Verilog HDL,初识Verilog HDL,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

        我们都知道 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) beginif (reset)out <= 0;elseout <= 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中的算术运算符提供了基本的数学操作,这对于实现数字电路中的算术功能非常重要。在使用这些运算符时,需要注意位宽和溢出等问题。

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

这篇关于FPGA第 8 篇,硬件描述语言Verilog HDL,初识Verilog HDL的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1115796

相关文章

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

Linux操作系统 初识

在认识操作系统之前,我们首先来了解一下计算机的发展: 计算机的发展 世界上第一台计算机名叫埃尼阿克,诞生在1945年2月14日,用于军事用途。 后来因为计算机的优势和潜力巨大,计算机开始飞速发展,并产生了一个当时一直有效的定律:摩尔定律--当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会增加一倍,性能也将提升一倍。 那么相应的,计算机就会变得越来越快,越来越小型化。

docker学习系列(一)初识docker

在第一版本上线之后公司,我们决定将之前使用的开源api文档项目转移到本公司的服务器之上,之前用的是showdoc,showdoc利用的是php技术,作为java程序员表示需要快速部署php环境以及apach容器都需要时间,所以采用第二种方法,即利用docker进行快速部署(虽然学习成本也不比php少)。 一、docker简介 docker的官网是https://www.docker.com,

FPGA编译与部署方法全方位介绍

FPGA编译与部署是FPGA开发中的核心环节,涉及从代码编写、调试到将设计部署到FPGA硬件的全过程。这个流程需要经过创建项目、编写FPGA VI、模拟调试、编译生成比特流文件,最后将设计部署到硬件上运行。编译的特点在于并行执行能力、定制化硬件实现以及复杂的时钟管理。通过LabVIEW的FPGA模块和NI硬件,可以快速完成开发和部署,尤其适用于复杂控制与高性能数据处理系统。 1. FPG

框架template初识

框架初识 框架就是一个别人帮我们搭好的舞台,造好了很多现成的工具供我们使用,让开发过程更快速、简洁。 Gin框架介绍 Gin 是一个用 Go (Golang) 编写的 HTTP Web 框架。 Gin是一个用Go语言编写的web框架。它是一个类似于martini 但拥有更好性能的API框架, 由于使用了 httprouter,速度提高了近40倍。 第一个Gin示例 package mai

FPGA开发:条件语句 × 循环语句

条件语句 if_else语句 if_else语句,用来判断是否满足所给定的条件,根据判断的结果(真或假)决定执行给出的两种操作之一。 if(表达式)语句; 例如: if(a>b) out1=int1; if(表达式)         语句1; else         语句2; 例如: if(a>b)out1=int1;elseout1=int2; if(表达式1) 语句1; els

数字电路专题:verilog 阻塞赋值和非阻塞赋值

verilog 阻塞赋值 和 非阻塞赋值 “=”阻塞赋值, ”<=”非阻塞赋值。阻塞赋值为执行完一条赋值语句,再执行下一条,可理解为顺序执行,而且赋值是立即执行; 非阻塞赋值可理解为并行执行,不考虑顺序,在 always 块语句执行完成后,才进行赋值。 如下面的阻塞赋值: //代码如下:module top(din,a,b,c,clk);input din;input clk;out

机器视觉硬件选型根据某项目相机镜头

一 项目总需求 1、大视野检测需求: (1)大视野: ①产品尺寸15.6寸屏幕,产品大小:350mm x 225mm; ②产品料盘尺寸大小:565mm x 425mm; ③工作距离:880mm;检测精度:500μm; 1、大视野检测需求: (1)大视野: ①产品尺寸15.6寸屏幕,产品大小:350mm x 225mm; ②产品料盘尺寸大小:565mm x 425mm; 工作距离:

FPGA开发:模块 × 实例化

模块的结构 对于C语言,其基本单元为函数。与此类似,Verilog的基本设计单元称之为"模块"(block)。对于整个项目的设计思想就是模块套模块。 一个模块由两个部分组成:一部分描述接口,一部分描述逻辑功能。 每个Verilog模块包含4个部分:端口定义、IO说明、内部信号声明、功能定义。且位于module和endmodule之间,如下: module block(a,b,c);inpu

【数据结构】--初识泛型

1. 包装类 在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类型。 1.1 基本数据类型和对应的包装类 除了 Integer 和 Character, 其余基本类型的包装类都是首字母大写。 1.2 (自动)装箱和(自动)拆箱 装箱(装包): 把 基本数据类型 变为 包装类类型 的过程 叫做装箱。 反汇编指