Verilog HDL基本语法规则

news2024/9/20 1:15:51

⭐本专栏针对FPGA进行入门学习,从数电中常见的逻辑代数讲起,结合Verilog HDL语言学习与仿真,主要对组合逻辑电路与时序逻辑电路进行分析与设计,对状态机FSM进行剖析与建模。
🔥文章和代码已归档至【Github仓库:hardware-tutorial】,需要的朋友们自取。或者公众号【AIShareLab】,回复 FPGA 也可获取。

文章目录

    • 词法规定
      • 1.间隔符
      • 2.注释符
      • 3.标识符和关键词
    • 逻辑值集合
    • 常量及其表示
      • 整数型常量
      • 实数型常量
      • 字符串常量
      • 符号常量
        • parameter和localparam区别
    • 数据类型(Data Types)
      • 变量的数据类型
      • 线网类型变量及其说明
      • 关于多重驱动
      • 寄存器变量类型
        • 寄存器变量类型及其说明
      • memory型变量的用法

词法规定

为对数字电路进行描述,Verilog语言规定了一套完整的语法结构。

1.间隔符

Verilog 的间隔符主要起分隔文本的作用,可以使文本错落有致,便于阅读与修改。间隔符包括空格符(\b)、TAB 键(\t)、换行符(\n)及换页符。

2.注释符

注释只是为了改善程序可读性,编译时不起作用。

  • 多行注释符(用于写多行注释): /* — */;
  • 单行注释符 :以//开始到行尾结束为注释文字。

3.标识符和关键词

标识符: 给对象(如模块名、电路的输入与输出端口、变量等)取名所用的字符串。以英文字母或下划线开始
如,clk、counter8、_net、bus_A 。

关键词: 用Verilog语言本身规定的特殊字符串定义语言的结构。例如,module、endmodule、input、output、wire、reg、and等都是关键词。关键词都是小写,关键词不能作为标识符使用 。

逻辑值集合

为了表示数字逻辑电路的逻辑状态,Verilog语言规定了4种基本的逻辑值。

0逻辑0、逻辑假
1逻辑1、逻辑真
x或X不确定的值(未知状态)
z或Z高阻态

常量及其表示

三种类型的常量

  • 整数型常量
  • 实数型常量
  • 字符串型常量

整数型常量

十进制数形式的表示方法:表示有符号常量。例如:30、-2

带基数形式的表示方法:

格式为:<+/-><位宽>’<基数符号><数值>

例如:3’b101、5’o37、8’he3,8’b1001_0011

实数型常量

十进制记数法 如: 0.1、2.0、5.67

科学记数法 如: 23_5.1e2、5E-4、23510.0、0.0005

字符串常量

字符串是用双撇号括起来的字符序列,它必须包含在同一行中,不能分成多行书写。例如:

    ''this is a string''
    ''hello world!''

符号常量

Verilog 允许用参数定义语句定义一个标识符来代表一个常量,称为符号常量。定义的格式为:

parameter 参数名1=常量表达式1 ,参数名2=常量表达式2 , … 

parameter BIT=1, BYTE=8, PI=3.14;

parameter和localparam区别

Verilog中用parameter或者localparam来定义常量,即用来定义一个标志符代表一个常量,从而提高程序的可读性。其说明格式如下:

parameter/localparam    参数名1=表达式,参数名2=表达式, …;

区别:

  • parameter可用作在顶层模块中例化底层模块时传递参数的接口;
  • localparam的作用域仅仅限于当前module,不能作为参数传递的接口。

数据类型(Data Types)

变量的数据类型

  • 线网型
  • 寄存器型

线网类型:是指输出始终根据输入的变化而更新其值的变量,它一般指的是硬件电路中的各种物理连接.

例:网络型变量L的值由与门的驱动信号A和B所决定,即L=A&B。A、B的值发生变化,线网L的值会立即跟着变化。

常用的线网类型由关键词wire定义,格式如下:

wire [n-1:0] 变量名1,变量名2,…,变量名n;

线网类型变量及其说明

线网类型功能说明
wire, tri用于表示单元(元件)之间的连线,wire为一般连线; tri用于描述由多个信号源驱动的线网,并没有其他特殊 意义,两者的功能完全相同。
wor, trior具有线或特性的线网,用于一个线网被多个信号驱动的 情况
wand, triand具有线与特性的线网,用于一个线网被多个信号驱动的 情况
trireg具有电荷保持特性的线网类型,用于开关级建模
tri1上拉电阻,用于开关级建模
tri0下拉电阻,用于开关级建模
supply1用于对电源建模,高电平1
supply0用于对地建模,低电平0

关于多重驱动

在写可综合的Verilog代码时,建议不要对同一个变量进行多次赋值(简称多重驱动),以避免出现多个信号同时驱动一个输出变量的情况。

例如,A、B、C三个内部信号同时接到(驱动)一个输出端L。或者说,输出L同时被三个内部信号所驱动。此时L的逻辑值可无法确定。

寄存器型变量对应的是具有状态保持作用的电路等元件,如触发器、寄存器。寄存器型变量只能在initial或always内部被赋值。

寄存器变量类型

寄存器变量类型及其说明

寄存器类型功能说明
reg常用的寄存器型变量
integer32位带符号的整数型变量
real/realtime64位带符号的实数型变量
time64位无符号的时间变量
reg    clock;            //例:一个1位寄存器变量的声明
reg [3:0]  counter;       //例:一个4位寄存器变量的声明

memory型变量的用法

Verilog通过对reg型变量建立数组来对存储器建模,可以描述RAM型存储器、ROM存储器和reg文件。数组中每个单元通过一个数组索引地址。

其格式定义如下:

reg [n-1:0] 存储器名 [m:0]

注意1:

reg [N-1:0] ram;  //一个N位的寄存器
reg  ram [N-1:0]; //一个由N个1位寄存器组成的存储器组

注意2:

不可以对一个完整的寄存器组赋值,只能指定该寄存器组中的地址赋值。


公众号【AIShareLab】一起交流更多相关知识,前沿算法,Paper解读,项目源码,面经总结。

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

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

相关文章

10大面试必备的排序算法 Python 实现(附源码)

今天给大家分享一篇关于Python实现排序算法的文章&#xff0c;来自GitHub。 排序算法是《数据结构与算法》中最基本的算法之一。 排序算法可以分为内部排序和外部排序&#xff0c;内部排序是数据记录在内存中进行排序&#xff0c;而外部排序是因排序的数据很大&#xff0c;一…

STM32入门基础

GPIO <1>说明 引脚电平&#xff1a;0~3.3V&#xff0c;部分可达到5V(参考引脚定义&#xff0c;带FT的就可以) 同时 GPIO有两个模式 输出模式&#xff1a;进行端口高低电平的输出&#xff0c;用于驱动LED&#xff0c;蜂鸣器等 输入模式&#xff1a;读取端口高低电平…

SimBERT剖析

SimBERT SimBERT&#xff0c;它是以Google开源的BERT模型为基础&#xff0c;基于微软的UniLM思想设计了融检索与生成于一体的任务&#xff0c;来进一步微调后得到的模型&#xff0c;所以它同时具备相似问生成和相似句检索能力。 UniLM UniLM是一个融合NLU和NLG能力的Transfo…

远程桌面控制:SmartCode VNC ViewerX ActiveX 3.10 Crack

SmartCode::ViewerX VNC 查看器 ActiveX 毫不费力地将 VNC 查看器功能添加到您的应用程序 SmartCode ViewerX VNC 查看器 ActiveX 使开发人员可以使用一组直观的 ActiveX 属性和方法完全访问 VNC 查看器功能。借助ViewerX 控件&#xff0c;开发人员可以轻松地为其应用程序提供屏…

将自己写的代码利用git 上传到码云(gitee)或者github----最简洁明了版

前置操作 注册并激活码云账号&#xff08; 注册页面地址&#xff1a;https://gitee.com/signup &#xff09; 生成并配置 SSH 公钥 官方提供的生成并配置公钥的方法点此 创建空白的码云仓库 输入仓库名称之后路径会自动生成 把本地项目上传到码云对应的空白仓库中 如果您是…

MyBatis-Plus快速开始

文章目录介绍特性框架结构传统编程模式快速开始介绍 MyBatis-Plus&#xff08;简称 MP&#xff09;是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。只做增强不做改变的意思是&#xff1a;MP不会影响原生的 M…

[HITCON 2017]SSRFme(perl脚本中get命令执行漏洞)

目录 代码审计 思路 知识补充 PHP中$_SERVER的详细用法 pathinfo() 函数 str_replace() 函数 escapeshellarg peal函数中get命令漏洞 Perl中open命令执行&#xff08;GET&#xff09; 代码审计 <?phpif (isset($_SERVER[HTTP_X_FORWARDED_FOR])) {$http_x_headers…

GuLi商城-项目初始结构创建

GitHub账号和密码 账号&#xff1a;11360XXXXXqq.com 密码&#xff1a;ZH**SH*19**1016 新建仓库&#xff1a; gulimall 记得勾选下Add a README file&#xff0c;上面忘记勾选了&#xff0c;实际建议还是要勾选下 复制路径&#xff1a; 打开IDEA检出项目 创建商品微服务模…

flutter 作为模块引入 iOS 项目

原文 http://summerxx.com/2023/01/28/ios-use-flutter/ 前言: 上篇我讲了下 flutter 环境在 MacOs 下搭建, 今天写下如何在一个成熟的 iOS 项目内引用 flutter, Demo 会放到文章最后哈 上篇 : MacOS 下配置flutter 环境 大致如下: 在项目内创建一个 flutter 模块 新建一个 …

Unity 在URP中显示动态批处理 Dynamic Batching 选项

Unity 在URP中显示动态批处理 Dynamic Batching 选项前言步骤1. 打开 Preferences 设置2. 选择 Core Render Pipeline 选项卡3. 修改 Visibility 为 All Visible4. 打开 Project Settings5. 打开 Graphics 选项卡6. 找到 URP 设置7. 开启 Dynamic Batching鸣谢前言 使用URP时突…

计算机相关专业提升学历的解决方案(本科及以下)

文章目录1、学历与学位的区别1.1 学历与学位的概念&#xff0c;学籍的规则1.2 学历与学位的作用2、正规全日制本科2.1 高考2.2 统招专升本3、继续教育&#xff08;非全日制&#xff09;3.1 自学考试&#xff08;无学籍&#xff09;3.2 成人高考&#xff08;函授&#xff0c;业余…

详谈ORB-SLAM2的跟踪线程Tracking

ORB-SLAM2的三大线程几乎都是每个部分对应一个函数&#xff0c;非常清晰。函数名起的都十分贴切&#xff0c;望文就能生义&#xff0c;我们更应该关注的是里面的关键帧地图点这些变量是怎么流转的。 Tracking线程的流程就是&#xff1a;首先输入一帧图像&#xff0c;然后实际上…

开启前端CSS学习之路-css003

&#x1f60a;博主页面&#xff1a;鱿年年 &#x1f449;博主推荐专栏&#xff1a;《WEB前端》&#x1f448; ​&#x1f493;博主格言&#xff1a;追风赶月莫停留&#xff0c;平芜尽处是春山❤️ 目录 CSS引入方式 一、CSS的三种样式表 1.内部样式表 2.行内样式表 3.外…

用java判断闰年

闰年的判断&#xff1a; 能被400整除的年份是闰年能被4整除的但是不能被100整除的年份是闰年 import java.util.Scanner; public class leapYear{public static void main(String[] args){int year;Scanner sc new Scanner(System.in);year sc.nextInt();if((year % 400 0)…

Java中对象的比较

从大根堆说到对象的比较大小根堆对象的比较equalsComparableComparator大小根堆 大小根堆是堆相关的知识,堆这种数据结构总结起来就是:堆顶元素是最大的就是大根堆,而每个堆顶元素以下的又可以看成一个堆: 要注意的是,堆底层是用数组实现的: 但是对这种数据结构具体化之后与…

JVM OOM和CPU问题排查

目录 1、JVM调优工具 1.1、jps 1.2、jstat 1.3、jstack 1.4、jinfo 1.5、jmap 2、OOM排查过程 2.1、OOM原因 2.2、OOM发生区域 2.2.1、Java堆溢出&#xff1a;heap 2.2.2、Java栈溢出&#xff1a;stack 2.2.3、运行时常量溢出&#xff1a;constant 2.2.4、方法区…

计算机毕业设计选题推荐nodejs+vue355的网上购物商城系统

网上购物商城&#xff0c;在系统首页可以查看首页、关于我们、商品信息、新闻信息、交流论坛、留言反馈、个人中心、后台管理、在线客服等内容 前端技术&#xff1a;nodejsvueelementui 前端&#xff1a;HTML5,CSS3、JavaScript、VUE 1、 node_modules文件夹(有npn install产…

spring整合mybatis的核心思路(数据源切换)

文章目录1. 整合思路2. 最简单的整合步骤1. 导入依赖2. 准备基础类UserUserMapperuserMapper.xmlMybatisConfig3. 测试TestMybatisSpring3. 整合多个mybatis配置1. 修改MybatisConfig2. 测试TestMybatisSpring4. AbstractRoutingDataSource实现源切换1. 准备基础类PersonPerson…

JVM的栈内存

每当启动一个新线程时&#xff0c;Java虚拟机都会为它分配一个Java栈。Java栈以帧为单位保存线程的运行状态。虚拟机只会直接对Java栈执行两种操作&#xff1a;以帧为单位的压栈和出栈。 某个线程正在执行的方法被称为该线程的当前方法&#xff0c;当前方法使用的栈帧称为当前帧…

车载以太网 - SomeIP测试 - 初识 - 01

SOA,Service-Oriented Architecture,即面向服务的架构 SOA是一种面向服务的架构,定义了“服务器”和“客户端”,前者是服务、数据的提供者,后者是订阅了所需要的服务或者数据。应用程序之间是公三耦合,并通过服务总线作为中间件进行通信。SOA更像是一种框架,需要将信息从…