【Verilog HDL 入门教程】 —— 学长带你学Verilog(基础篇)

news2025/1/11 5:20:35

文章目录

  • 一、Verilog HDL 概述
    • 1、Verilog HDL 是什么
    • 2、Verilog HDL产生的背景
    • 3、Verilog HDL 和 VHDL的区别
  • 二、Verilog HDL 基础知识
    • 1、Verilog HDL 语言要素
      • 1.1、命名规则
      • 1.2、注释符
      • 1.3、关键字
      • 1.4、数值
        • 1.4.1、整数及其表示
        • 1.4.2、实数及其表示
        • 1.4.3、字符串及其表示
    • 2、数据类型
      • 2.1、线网型(wire)
      • 2.2、寄存器型(reg)
      • 2.3、存储器型(memory)
      • 2.4、整数型(integer)
      • 2.5、时间型(time)
      • 2.6、实数型(real)
      • 2.7、参数型
    • 3、运算符
      • 3.1、算术运算符
      • 3.2、关系运算符
      • 3.3、相等关系运算符
      • 3.4、逻辑运算符
      • 3.5、按位运算符
      • 3.6、归约运算符
      • 3.7、移位运算符
      • 3.8、连接运算符
  • 总结

一、Verilog HDL 概述

1、Verilog HDL 是什么

Verilog HDL(Hardware Description Language)是一种硬件描述语言,用于从算法级、门级到开关级的多种抽象设计层次的数字系统建模。 现实生活中多用于专用集成电路(Application Specific Integrated Circuit,ASIC)和现场可编程门阵列(Field Programmabl Gate Array,FPGA)的实现。

2、Verilog HDL产生的背景

第一只晶体管出现后,数字集成电路设计密度越来越大、电路越来越复杂,传统的画图或连线的设计方法已不再适用。

例如:设计4位移位寄存器,仅需简短几行代码完成。
在这里插入图片描述

module register_four(
	input 	clk		,
	input 	Reset	,
	input 	din		,
	
	output reg [3:0] qout
    );
	
always @(posedge clk or posedge Reset)begin
	if(Reset)
		qout <= 4'b0;
	else 
		qout <= {qout[2:0],din};
end 

endmodule

若要将4位移位寄存器改为8位移位寄存器,仅需修改少量代码。

在这里插入图片描述

module register_eight(
	input 	clk		,
	input 	Reset	,
	input 	din		,
	
	output reg [7:0] qout
    );
	
always @(posedge clk or posedge Reset)begin
	if(Reset)
		qout <= 8'b0000_0000;
	else 
		qout <= {qout[6:0],din};
end 

endmodule

由上例可直观发现,Verilog HDL可用较少的语句描述较为复杂的电路和灵活的可扩展性,为数字集成电路设计带来了极大的便捷。

3、Verilog HDL 和 VHDL的区别

目前,Verilog HDL 和 VHDL(VHSIC Hardware Description Language,VHSIC 为 Very High Speed Integrated Circuit)是最为常用的硬件描述语音。
Verilog HDL:
语法灵活、宽松,多被思维活跃的美国人采用。因Verilog HDL 语法宽松,其不适合对系统要求层次严格的大规模设计。
VHDL:
语法结构紧凑、严谨,多被思维欧洲人采用。VHDL在大规模数字集成电路设计中具有一定优势。

注:
Verilog基于C语言发展而来,语法灵活、宽松,且国内开发人员多采用Verilog,对初学者较为友好。

二、Verilog HDL 基础知识

1、Verilog HDL 语言要素

1.1、命名规则

在Verilog HDL 中,标识符背用来命名信号、模块、参数等,它可以是任意一组字母、数字、$符号和_(下划线)符号的组合。

:标识符中字母区分大小写,且第一个字必须是字母或下划线。

1.2、注释符

单行注释:单行注释以“//”开始,Verilog HDL忽略此处到行尾的内容。
多行注释:多行注释采用“/**/”,从“/”开始,到“/”结束,Verilog HDL忽略其中注释的内容。

:多行注释不允许嵌套,但单行注释可以嵌套在多行注释中。

例如:

非法多行注释:
	/*注释内容/*多行注释嵌套多行注释*/注释内容*/
合法多行注释:
	/*注释内容//多行注释嵌套单行注释*/

1.3、关键字

Verilog HDL 内部已经使用的词成为关键字或保留字,是事先定义好的确认符,用来组织语言结构。

:Verilog HDL中所有的关键字都是小写的。
在这里插入图片描述

1.4、数值

Verilog HDL 有四种基本的电平逻辑数值状态,用数字或字符表达数字电路中传送的逻辑状态和存储信息。Verilog HDL逻辑数值中,“x”和“z”都不区分大小写,即0x1z与0X1Z等价。

在这里插入图片描述
在数值中,下划线符号“_”除不能放于首位外,可随意用在整数与实数中,对数值的大小无影响,仅为提高可读性。

例如:
8’b00110010 与8’b0011_0010的数值大小相等。

1.4.1、整数及其表示

在这里插入图片描述
整数的表示形式:
+/-<size>'<base_format><number>
(1)“+/-”:正数和负数的标识。
(2)size:换算过后二进制的宽度。
(3)“ ’ ”:为基数格式表示固有字符,该字符不能缺省,否则为非法表示形式。
(4)base_format:基数符号。
(5)number:可使用的数字字符集。

例如:

4'b0011   
7'd32
8'hfd     
1.4.2、实数及其表示

(1)十进制表示法。
(2)科学计数发。例如:758.4e2 的值为75840.0,3e-3的值为0.003。

1.4.3、字符串及其表示

:字符串必须包含在同一行中,不能分行书写。

字符串在Verilog HDL中看做8位的ASCII值序列,即一个字符对应8位的ASCII值。

2、数据类型

按抽象程度 Verilog HDL数据类型可分为:物理数据类型(主要包括线网型及寄存器型)和抽象数据类型(主要包括整数型、时间型、实数型及参数型)。抽象数据类型主要用于辅助设计和验证。

2.1、线网型(wire)

wire 类型表示硬件单元之间的物理连线,由其连接的器件输出端连续驱动。如果没有驱动元件连接到 wire 型变量,缺省值一般为 “Z”。对wire 类型赋值用“assign”。

例如:

wire data_out ;
wire flag ;

assign data_out = data_in ;
assign flag = 1'b1 ;

2.2、寄存器型(reg)

reg 用来表示存储单元,它的数据会保持最后一次赋值,直到被改写。reg 默认初始值为不定值“x”,缺省是数据位宽为1位。reg 一般为无符号数,若将一个负数赋值给 reg 型变量,则制动转换其二进制补码形式。

例如:

reg data0;
reg data1;

reg [4:0] data2;

2.3、存储器型(memory)

存储器型本质上还是寄存器型变量阵列,可以描述RAM型、ROM型存储器以及reg文件。存储器中的每一个单元通过索引进行寻址。
声明格式:
reg<range1><name_of_register><range2>
(1) range1:存储器中寄存器的位宽,缺省,时为1,格式为[msb:lsb]。
(2)range2:寄存器的个数,缺省时为1,格式为[msb:lsb]。
(3)name_of_register:变量名称列表,一次可以定义多个名称,之间用逗号分开。

例如:

reg [7:0] mem1[255:0];//定义了一个有256个8位的存储器
reg [15:0] mem2[127:0],reg1,reg2;//定义了一个具有128个16位的寄存器mem2
								//2个16位的寄存器reg1和reg2

mem1[2] = 0; //给mem1存储器中的第三个存储单元赋值为0

2.4、整数型(integer)

整数类型用关键字 integer 来声明。声明时不用指明位宽,位宽和编译器有关,一般为32 bit。reg 型变量为无符号数,而 integer 型变量为有符号数。

例如:

reg [31:0]      data1 ;
reg [3:0]       byte1 [7:0]; //数组变量,后续介绍
integer j ;  //整型变量,用来辅助生成数字电路

always@* begin
    for (j=0; j<=3;j=j+1) begin
        byte1[j] = data1[(j+1)*8-1 : j*8]; //把data1[7:0]…data1[31:24]依次赋值给byte1[0][7:0]…byte[3][7:0]
    end
end

2.5、时间型(time)

Verilog 使用特殊的时间寄存器 time 型变量,对仿真时间进行保存。其宽度一般为 64 bit,通过调用系统函数 $time 获取当前仿真时间。

例如

time current_time ;
initial begin
       #100 ;
       current_time = $time ; //current_time 的大小为 100
end

2.6、实数型(real)

实数用关键字 real 来声明,可用十进制或科学计数法来表示。实数声明不能带有范围,默认值为 0。如果将一个实数赋值给一个整数,则只有实数的整数部分会赋值给整数。

例如:

real        data1 ;
integer     temp ;
initial begin
    data1 = 2e3 ;
    data1 = 3.75 ;
end
 
initial begin
    temp = data1 ; //temp 值的大小为3
end

2.7、参数型

参数用来表示常量,用关键字parameter声明,只能赋值一次,但可通过实例化的方式更改参数在模块中的值。局部参数用localparam声明,其作用和用法与parameter相同,区别在于它的值不能改变。所以当参数在本模块中调用时,可以用localparam来说明。

3、运算符

在这里插入图片描述

3.1、算术运算符

Verilog HDL中常用的算术运算符主要有五种,分别是加法(+)、减法(-)、乘法(*)、除法(/)和取模(%)。

注:
算术表达式结果的长度由最长的操作数决定。在赋值语句下,算术结果的长度由等号操作符左端的目标长度决定。

3.2、关系运算符

关系运算符也是双目运算符,是对两个操作数的大小进行比较。关系运算符有大于(>)、小于(<)、大于等于(>=)和小于等于(<=)几种。

3.3、相等关系运算符

相等关系运算符是对两个操作数进行比较,比较结果有三种,即真(1)、假(0)和不定值(x)。Verilog HDL 中有四种相等关系运算符:等于(==)、不等于(!=)、全等(===)、非全等(!==)。
在这里插入图片描述

3.4、逻辑运算符

逻辑运算符有三种,分别为逻辑与(&&)、逻辑或(||)、逻辑非(!)。其中逻辑与、逻辑或是双目运算符,逻辑非为单目运算符。在这里插入图片描述

3.5、按位运算符

Verilog HDL 提供了五种类型位运算符:按位取反(~)、按位与(&)、按位或(|)、按位异或(^ )、按位同或(^~),按位运算符对其自变量的每一位进行操作。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.6、归约运算符

归约操作符包括:归约与(&),归约与非(~&),归约或(|),归约或非(~|),归约异或(^),归约同或(~^)。归约操作符只有一个操作数,它对这个向量操作数逐位进行操作,最终产生一个 1bit 结果。逻辑操作符、按位操作符和归约操作符都使用相同的符号表示,因此有时候容易混淆。区分这些操作符的关键是分清操作数的数目,和计算结果的规则。

例如:

A = 4'b1010 ;
&A ;      //结果为 1 & 0 & 1 & 0 = 1'b0,可用来判断变量A是否全1
~|A ;     //结果为 ~(1 | 0 | 1 | 0) = 1'b0, 可用来判断变量A是否为全0
^A ;      //结果为 1 ^ 0 ^ 1 ^ 0 = 1'b0

3.7、移位运算符

移位操作符包括左移(<<),右移(>>),算术左移(<<<),算术右移(>>>)。移位操作符是双目操作符,两个操作数分别表示要进行移位的向量信号(操作符左侧)与移动的位数(操作符右侧)。算术左移和逻辑左移时,右边低位会补 0。逻辑右移时,左边高位会补 0;而算术右移时,左边高位会补充符号位,以保证数据缩小后值的正确性。

A = 4'b1100 ;
B = 4'b0010 ;
A = A >> 2 ;        //结果为 4'b0011
A = A << 1;         //结果为 4'b1000
A = A <<< 1 ;       //结果为 4'b1000
C = B + (A>>>2);    //结果为 2 + (-4/4) = 1, 4'b0001

3.8、连接运算符

拼接操作符用大括号 {,} 来表示,用于将多个操作数(向量)拼接成新的操作数(向量),信号间用逗号隔开。拼接符操作数必须指定位宽,常数的话也需要指定位宽。

例如:

A = 4'b1010 ;
B = 1'b1 ;
Y1 = {B, A[3:2], A[0], 4'h3 };  //结果为Y1='b1100_0011
Y2 = {4{B}, 3'd4};  //结果为 Y2=7'b111_1100
Y3 = {32{1'b0}};  //结果为 Y3=32h0,常用作寄存器初始化时匹配位宽的赋初值

总结

该篇主要讲述Verilog HDL 常用数据类型、运算符等基础部分。受篇幅限制,此次未涉及至实际应用,后期将逐一讲解。

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

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

相关文章

Spire.PDF for .NET【文档操作】演示:检测 PDF 文件是否为 PDF/A

Spire.PDF 为开发人员提供了两种方法来检测 PDF 文件是否为 PDF/A。一种是使用 PdfDocument.Conformance 属性&#xff0c;另一种是使用 PdfDocument.XmpMetaData 属性。以下示例演示了如何使用这两种方法检测 PDF 文件是否为 PDF/A。 Spire.PDF for .NET 是一款独立 PDF 控件…

详细分析JWT的基本知识(附Demo)

目录 前言1. 基本知识2. JWT验证过程3. Demo 前言 对于Java的基本知识推荐阅读&#xff1a; java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff09;【Java项目】实战CRUD的功能整理&#xff08;持续更新&#xff09; 1. 基本知识 紧凑的、U…

机器学习回归分析系列2-二项回归模型

04 二项回归模型 4.1 简介 二项回归模型用于处理二元响应变量&#xff0c;即因变量是0或1的分类变量。最常见的二项回归模型是逻辑回归&#xff0c;它可以用来预测事件发生的概率。 逻辑回归模型假设&#xff1a; 其中&#xff0c;p 是事件发生的概率&#xff0c;x1,x2,…,x…

allegro PCB设计心得笔记(四) -- 显示坐标原点和更改默认产品选项

一、修改坐标原点 Allegro PCB设计过程中&#xff0c;有时需要修改坐标原点&#xff0c;但是PCB文件不显示坐标原点&#xff0c;无法确认已修改的坐标原点是否已经修改好。 显示PCB原点的设置方法如下&#xff1a; Setup -> Design Parameter Editor&#xff0c;如下图所示&…

Kafka系统及其角色

Apache Kafka系统介绍 Apache Kafka 是由 LinkedIn 公司最初开发的一个高性能、分布式的消息传递系统。它被设计为一个可扩展、持久、分布式的流式处理平台&#xff0c;以满足 LinkedIn 在实时数据处理方面的需求 。Kafka 的诞生源于 LinkedIn 需要处理海量数据时现有消息队列系…

深度解析:NPM、PNPM、Yarn 包管理工具的介绍与对比

在前端开发中&#xff0c;包管理工具是不可或缺的一部分&#xff0c;它们帮助我们轻松管理项目依赖、发布和共享代码。NPM、PNPM、Yarn 是目前最流行的包管理工具&#xff0c;但它们各有特点和使用场景。本文将深入解析这三大包管理工具&#xff0c;帮助你选择最适合自己项目的…

嘎嘎嘎拿到去年想要的包

一年多了 继续&#xff0c;把项目收尾吧 好好学前端&#xff0c;外企&#xff01;react&#xff01;从0开始&#xff0c;紧迫&#xff01;加油&#xff01;

react中使用nextjs框架,前端调后端接口跨域解决方式

前端在项目目录中next.config.js文件中添加以下代码 async rewrites() {return [{source: "/api/:path*",destination: ${process.env.NEXT_PUBLIC_API_DOMAIN}/api/:path*,basePath: false}]} 截图&#xff1a; source: "/api/:path*": 定义了一个 URL …

【源码+文档+调试讲解】基于python和协同过滤算法的电影推荐系统

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本基于python和协同过滤算法的电影推荐系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内…

【C++】位运算

目录 位运算概述 位运算常见操作 判断字符是否唯一 算法思路 代码实现 丢失的数字 算法思想 代码实现 两整数之和 算法思路 代码实现 只出现一次的数字 算法思路 代码实现 消失的两个数字 算法思想 代码实现 位运算概述 在计算机中我们知道数据在内存中都是以二…

科创微应用平台小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;场地信息管理&#xff0c;场地类型管理&#xff0c;预约参观管理&#xff0c;场地预约管理&#xff0c;活动信息订单&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首…

为具有公网IPV6地址的服务器安装nextcloudAIO并使用NginxProxyManager配置反向代理

软件和硬件环境 ubuntu server 24.04&#xff0c;并已配置好ipv6公网地址&#xff0c;已安装好docker和docker-compose。一块单独的硬盘&#xff0c;用于单独存储nextcloud数据。&#xff08;非必需&#xff09;有一个能够正常解析的域名&#xff0c;并已配置好AAAA记录解析。…

windows下wsl ubuntu 搭建深度学习环境

wsl安装ubuntu 删除之前安装的ubuntu; 查看都安装了哪些版本: wsl -l -v 删除想要删除的版本: wsl --unregister ${名字} 删除之后 ubuntu.exe的安装包还在c盘中, 找到它, 并将 ubuntu.exe的所在文件夹的所有文件都复制到你想要安装的新的路径下, 比如我在E盘新创建一个文…

ARM高性能计算(HPC)处理器Neoverse介绍

思考: Neoverse系列中的N、V、E有什么区别? 这三个字母的缩写又是什么? ARM Neoverse架构是ARM专为服务器、数据中心、高性能计算(HPC)和网络基础设施设计的一系列处理器架构。Neoverse架构分为N系列、V系列和E系列,这些系列面向不同的应用场景,各自有不同的设计目标和…

Hackademic.RTB1靶场实战【超详细】

靶机下载链接&#xff1a;https://download.vulnhub.com/hackademic/Hackademic.RTB1.zip 一、主机探测和端口扫描 nmap 192.168.121.0/24 ip:192.168.121.196 端口:22、80 二、访问80端口 发现target可点击 点击后跳转&#xff0c;页面提示目标是读取到 key.txt 文件 fin…

5.mysql多表查询

MYSQL多表查询 MYSQL多表查询1.多表关系笛卡尔积 2. 多表查询概述2.1 内连接2.2 外连接2.3自连接联合查询union &#xff0c;union all 2.4子查询2.4.1标量子查询2.4.2列子查询2.4.3行子查询2.4.4表子查询 MYSQL多表查询 create table student(id int auto_increment primary …

CMU15445 (Fall 2023) Project2 - EXTENDIBLE HASH INDEX 思路分享

文章目录 Task 1 - Read/Write Page GuardsPageGuard函数实现移动构造函数移动赋值函数UpgradeRead/UpgradeWriteDrop析构函数BufferPoolManager函数实现FetchPageBasicFetchPageRead/FetchPageWriteNewPageGuarded BUG调试 Task2 - Hash Table PageHeader PageDirectory PageB…

uniapp粘贴板地址识别

1&#xff1a; 插件安装 主要是依靠 address-parse 这个插件&#xff1a; 官网 收货地址自动识别 支持pc、h5、微信小程序 - DCloud 插件市场 // 首先需要引入插件 npm install address-parse --save 2&#xff1a;html部分 <view class""><view class&quo…

OSPF进阶

一、LSA详解 Type&#xff1a;LSA的类型&#xff08;1、2、3、4、5、7类&#xff09; link-state-ID&#xff1a;链路状态表示符 ADV router&#xff1a;产生该LSA的路由器 age&#xff1a;老化时间 Metric&#xff1a;开销值&#xff0c;一般都为ADV router到达该路由的开…

深度学习------------------卷积神经网络(LeNet)

目录 LeNet网络手写的数字识别MNIST总结卷积神经网络&#xff08;LeNet&#xff09; 问题 LeNet网络 手写的数字识别 MNIST ①输入的是&#xff1a;3232的image ②放到一个55的卷积层里面&#xff08;为什么是5&#xff1f;因为32-x128&#xff0c;∴x5&#xff09;&#xff0c…