verilog语法基础_verilog 输入悬空-程序员宅基地

技术标签: fpga开发  硬件工程  FPGA学习  verilog  


前言

  现在,我们已经通过了流水灯、按键控制led灯、按键控制蜂鸣器、状态机等项目的训练,对Veriolg也有初步的认识,但是我们没有系统的学习Verilog语法。相信你也遗留了很多关于Verilog的诸多问题,不用着急,本文将根据前期课程的实训内容,来学习Verilog语法。

一、硬件描述语言

1.1 什么是硬件描述语言

  硬件描述语言(Hardware Description Language, HDL)是电子系统硬件行为描述、结构描述、数据流描述的语言。利用这种语言,数字电路系统的设计可以从顶层到底层(从抽象到具体)逐层描述自己的设计思想,用一系列分层次的模块来表示极其复杂的数字系统。然后,利用电子设计自动化(Electronics Design Automation, EDA )工具,逐层进行仿真验证,再把其中需要变为实际电路的模块组合,经过自动综合工具转换到门级电路网表。接下去,再用专用集成电路(Application Specific Integrated Circuit,ASIC)或现场可编程门阵列 FPGA(Field-Programmable Gate Array,FPGA)自动布局布线工具,把网表转换为要实现的具体电路布线结构,VHDL(Very High Speed Integration Circuit,HDL)和 Verilog HDL 语言适应了这种趋势的要求,先后成为 IEEE 标准。

1.2 主要的硬件描述语言

  硬件描述语言主要包括:Verilog、VHDL、SystemVerilog。

1.2.1 Verilog HDL

  Verilog HDL拥有广泛的设计群体,成熟的资源也比 VHDL 丰富,语言从C编程语言中继承了多种操作符和结构,对于熟悉C语言的同学,学习verilog时上手会很快。

1.2.2 VHDL

  超高速集成电路硬件描述语言(Very High Speed Integrated Circuit Hardware Description Language,VHDL)是一种标准化程度较高的硬件描述语言,其语言特点包括:语法严谨、结构规范、移植性强、数据类型丰富。除此之外VHDL支持层次结构设计,独立于器件和设计平台,程序复用性强。

1.2.3 SystemVerilog

  SystemVerilog结合了来自 Verilog、VHDL、C++的概念,将硬件描述语言与现代的高层级验证语言结合了起来。所以SystemVerilog有上述两种语言和计算机高级语言的特征。
  建议学习Verilog HDL的原因:

  1. Verilog HDL 推出已经有 20 年了,拥有广泛的设计群体,成熟的资源也比 VHDL 丰富,Verilog HDL未来发展趋势。
  2. 它非常容易掌握,只要有 C 语言的编程基础,通过比较短的时间,经过一些实际的操作,可以在 2 ~ 3 个月内掌握这种设计技术。
  3. 在中国很多集成电路设计公司都采用Verilog,一般大型项目采用VHDL。
  4. SystemVerilog是Verilog的升级,对于“小白”,应该从学习Verilog开始。

二、基础知识

2.1 逻辑值

  • 逻辑0:表示低电平,也就对应我们的电路GND。
  • 逻辑1:表示高电平,也就对应我们电路的VCC。
  • 逻辑X:表示未知,有可能是高电平,也有可能是低电平。
  • 逻辑Z:·表示高阻态,外部没有激励信号(输入信号),是一个悬空状态(未接高低电平)。

逻辑值

图1. 逻辑器件图

2.2 进制格式

  Verilog数字进制格式包括二进制(binary)、八进制(octal)、十进制(decimal)和十六进制(hexadecimal)。一般常用的为二进制、十进制和十六进制。

  • 二进制表示如下:4’b0101表示4位二进制数字0101
  • 八进制表示如下:4’o7表示4位八进制数7(二进制0111)
  • 十进制表示如下:4’d2表示4位十进制数字2(二进制0010)
  • 十六进制表示如下:4’ha表示4位十六进制数字a(二进制1010)

  注意:如果数值未表明位宽和进制,则:默认为32位宽的十进制数字(32’d),常见写法:16’b1001_1010_1010_1001=16’h9AA9

2.3 标识符(变量名)

  标识符:用于定义模块名、端口名、信号名等(就是起个名字而已)。标识符命名规则:

  • 标识符可以是任意一组字母数字$_(下划线)符号的组合。
  • 但标识符不允许以数字开头,和c语言类似。
  • 标识符严格区分大小写,大小写敏感
  • 不建议大小写混合使用。
  • 普通内部信号建议全部小写
  • 命名最好体现信号的含义,简介、清晰、易懂(见名知意)

  例子:

  1. 有意义的标识符:sum
  2. 用下划线区分词:cpu_addr
  3. 采用一些前缀或后缀:时钟clk_50或sys_clk

三、数据类型

3.1 概述

  在Verilog中,主要数据类型:
1. 寄存器数据类型(register)
2. 线网数据类型(wire)

3. 参数数据类型(parameter)
4. 整型(integer)

  注意:真正在数字电路中起作用的数据类型是寄存器数据类型线网数据类型

3.2 寄存器类型

  寄存器表示一个抽象的数据存储单元,通过赋值语句可以改变寄存器存储的值 ,寄存器数据类型的关键字是reg,reg类型数据的默认初始值为不定值x。
  如: reg [9:0] delay_cnt; //双斜杠表示注释,不参与编译
     reg key_reg;

  reg类型的数据只能在always语句和initial语句中被赋值。如果该过程语句描述的是时序逻辑,即always语句带有时序时钟信号,则该寄存器变为对应为触发器;如果该过程语句描述的是组合逻辑,即always语句不带有时钟信号,则该寄存器变为对应硬件连线

3.3 线网类型

  1. 线网数据类型表示结构实体(例如门)之间的物理连线。
  2. 线网类型的变量不能存储值,它的值是由驱动它的元件所决定。
  3. 驱动线网型变量的元件有逻辑门、连续赋值语句(assign)等。
  4. 如果没有驱动元件连接到线网类型的变量上,则该变量就是高阻的,即为Z。
  5. 线网数据类型包括wire类型和tri类型,其中最常用的就是wire类型。

3.4 参数类型

  参数其实就是一个常量,在Verilog HDL中用parameter定义常量。我们可以一次定义多个参数,参数与参数之间需要用逗号(,)隔开。每个参数定义的右边必须是一个常数表达式。
  如: parameter H_FRONT = 11’d11; //行显示前沿
     parameter H_BACK = 11’d2; //行显示后沿

  参数型数据常用于定义状态机的状态、数据位宽和延迟大小等。采用标识符来表示一个常量可以提高程序的可读性可维护性。在模块调用时,可通过参数传递来改变被调用模块中已定义的参数。


四、运算符

  Verilog中的操作符按照功能分为以下几种类型:

  • 算数运算符
  • 关系运算符
  • 逻辑运算符
  • 条件运算符
  • 位运算符
  • 移位运算符
  • 拼接运算符

4.1 算数运算符

符号 使用方法 说明
+ a + b a加上b
- a - b a减去b
* a * b a乘以b
/ a / b a除以b
% a % b a模除b

注:除法运算(/):整数与整数相除的结果为整数

4.2 关系运算符

符号 使用方法 说明
> a > b a大于b
< a < b a小于b
>= a >= b a大于等于b
<= a <= b a小于等于b
== a == b a等于b
!= a != b a不等于b

4.3 逻辑运算符

符号 使用方法 说明
! !a a的非
如果a为0,那么a的非就是1。
&& a && b a与上b
如果a和b都为1,a&&b结果才为1,表示真
|| a || b a或上b
如果a或者b有一个为1,a||b结果为1,表示真

&&:左右两边同时为1,则结果为1
||:左右两边同时为0,则结果为0

4.4 条件运算符(三目运算符)

符号 使用方法 说明
?: a ? b : c 如果a为真,就选择b,否则选择c

如:result = a >= b ? a : b;

4.5 位运算符(二进制运算)

符号 使用方法 说明
~ ~a 将a的每个位进行取反
& a & b 将a的每个位与b相同的位进行相与
| a | b 将a的每个位与b相同的位进行相或
^ a ^ b 将a的每个位与b相同的位进行异或

~(取反):0变1,1变0
&(位与):同时为1,则结果为1
|(位或):有1,则1
^(异或):相同为0不同为1

注意:如果位运算左右两边变量的位宽不同,则比较小的位宽高位补0。

4.6 移位运算符

符号 使用方法 说明
<< a << b 将a左移b位
>> a >> b 将a右移b位

注意:两种移位运算符都用0来填补移出的空位。左移时,位宽增加;右移时,位宽不变。
   如:4’b1001 << 2 = 6’b100100;
     4’b1001 >> 1 = 4’b0100;

4.7 拼接符合

符号 使用方法 说明
{} {a,b} 将a和b位拼接起来,作为一个新信号

五、运算符的优先级

运算符 优先级
!、~ 最高
*、/、% 次高
+、- |
<<、>> |
<、<=、>、>= |
==、!=、===、>== |
& |
^、^~ |
| |
&& |
|| 次低
? 最低

注意:不清楚直接用小括号提高优先级。


六、常用关键词

关键字 含义
module 模块开始定义
input 输入端口定义
output 输出端口定义
inout 双向端口定义
parameter 信号的参数定义
wire wire信号定义
reg reg信号定义
always 产生reg信号语句的关键字
assign 产生wire信号语句的关键字
begin 语句起始标志
end 语句结束标志
edge/posedge/negedge 时序电路起始标志
case case语句起始标志
default case语句的默认分支标志
endcase case语句结束标志
if if/else语句标志
else if/else语句标志
for for语句标志
endmodule 模块结束定义

总结

  以上就是Verilog的基础语法,因为本文只针对前期实验课程内容,而进行基础语法的筛选讲解。在后期的课程中,将会根据实验讲解Verilog中的疑点和难点。敬请期待!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43828944/article/details/122099141

智能推荐

matlab编程控制舵机,船舶航向控制器设计(MATLAB,附仿真程序)-程序员宅基地

文章浏览阅读1.1k次。船舶航向控制器设计(MATLAB,附仿真程序)(课题申报表,任务书,开题报告,中期检查表,外文翻译,论文15400字,仿真程序,答辩PPT)摘 要本文对反向递推(Backstepping)设计方法在非线性船舶航向控制器中的应用进行了研究。Backstepping设计方法是近几年兴起的一种基于Lyapunov稳定性理论的比较先进的非线性控制方法。因此,本文首先对目前常见的非线性控制方法进行了概述,简..._舵机模型matlab程序

营销系统优惠券模板设计_优惠劵表结构设置-程序员宅基地

文章浏览阅读819次。目录券模板基础信息定义优惠券类型优惠券门槛优惠券面值/折扣率,折扣金额上限有效期自定义使用限定使用时间限定可用商品限定可用门店限定券模板设计类似于商品SKU,定义了一个券模板后,发券操作可以基于同一个券模板实现发放同一种优惠券给多个不同的用户。券模板基础信息定义一张优惠券的基础信息,例如常规的名称,类型,面值等等。下面罗列一些有逻辑含义的字段。优惠券类型立减券: 无门槛或有门槛的满减券,达到使用门槛后可以立减指定金额。 折扣券:按商品价格减免指_优惠劵表结构设置

(深度学习快速入门)人工智能、机器学习和深度学习总体概述_人工智能与深度学习 简明教程-程序员宅基地

文章浏览阅读3k次,点赞15次,收藏67次。线性回归:线性回归假设输出变量是若干输入变量的线性组合,并根据这一关系求解线性组合中的最优系数。具体来说,线性回归的作用是求得一组参数wi,i=0.1.,,,.nwi​,i=0.1.,,,.n,使预测输出可以表示为以这组参数为权重的实例属性的线性组合,引入常量x0=1x_{0}=1x0​=1,线性回归试图学习的模型就是当实例只有一个属性时,输入和输出之间的关系就是二维平面上的一条直线;_人工智能与深度学习 简明教程

python读取串口速度跟不上_串口读取数据很慢,怎么解决-程序员宅基地

文章浏览阅读1.9k次。byte[] reb = new byte[0x400];reb = myCom.Read(0x400);就是这个读取串口数据的函数public byte[] Read(int NumBytes){byte[] lpBuffer = new byte[NumBytes];if (this.hComm == -1){throw new ApplicationException("串口没有打开");}..._python读取串口速度跟不上

浏览器工作原理详解_在线浏览原理图-程序员宅基地

文章浏览阅读3.9w次,点赞47次,收藏283次。这是一篇全面介绍 Webkit 和 Gecko 内部操作的入门文章,是以色列开发人员塔利·加希尔大量研究的成果。在过去的几年中,她查阅了所有公开发布的关于浏览器内部机制的数据,并花了很多时间来研读网络浏览器的源代码。她写道: 在 IE 占据 90%市场份额的年代,我们除了把浏览器当成一个“黑箱”,什么也做不了。但是现在,开放源代码的浏览器拥有了过半的市场份额,因此,是时候来揭开神秘的面纱,一探网_在线浏览原理图

机器学习-Anomaly Detection_根据f1值或者查准率与查全率的比例来选择ε-程序员宅基地

文章浏览阅读347次。Problem Motivation异常检测(Anomaly detection)是机器学习算法的一个常见应用。这种算法的一个有趣之处在于:它虽然主要用于非监督学习问题,但从某些角度看,它又类似于一些监督学习问题。假想你是一个飞机引擎制造商,当你生产的飞机引擎从生产线上流出时,你需要进行 QA(质量控制测试),而作为这个测试的一部分,你测量了飞机引擎的一些特征变量,比如引擎运转时产生的热量,..._根据f1值或者查准率与查全率的比例来选择ε

随便推点

【啃书】《智能优化算法及其MATLAB实例》例5.1蚁群算法求解TSP问题_蚁群算法 约束优化 matlab-程序员宅基地

文章浏览阅读905次,点赞3次,收藏13次。文章目录问题描述仿真过程matlab源码问题描述仿真过程matlab源码%20201012lu注:该matlab代码成功在matlabR2019a运行%%%%%%%%%%%%%%%%%%%%蚁群算法解决TSP问题%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%clear all; %清除所有变量close all; _蚁群算法 约束优化 matlab

WPF页面切换之Page与Window_wpf window page-程序员宅基地

文章浏览阅读2.3k次。先从基础背景知识说起:一、Page与Window介绍1.应用程序GUI的所有内容都是包含在Window中的,想要显示东西?必须先创建一个Window或者一个Window的子类;2.Window下面可以直接写内容,写布局,但是这些内容和布局写完后只能是固定的、不可变的,这里是不可变是指Window的内容不会发生变化了,因为元素和布局是写死的了;3.在Window下面插入Frame作为容器,再用该Frame包含你的某个Page(***注意:所有的Page都需要容器包含,否则无法进行页面之间的跳转和导航!_wpf window page

C++抽象数据类型(ADT)表示和实现--链队列(Queue)_c++数据结构adt怎么写-程序员宅基地

文章浏览阅读1.5k次。先放上ADT的解释和预定义常量。抽象数据类型(ADT)是指一个数学模型以及定义在该模型上的一组操作。抽象数据类型的定义仅取决于它的一组逻辑特性,而与其在计算机内部如何表示和实现无关,即不论其内部结构如何变化,只要它的数学特性不变,都不影响其外部的使用。以下是队列的抽象数据类型定义。_c++数据结构adt怎么写

空调采集网关让空调更智能,让节能更简单!_空调外接网关进行数据采集的方案-程序员宅基地

文章浏览阅读304次。钡铼技术作为全球行业领先技术水平的工业物联网硬件研发企业,拥有资深的工控物联网产品的研发能力以及专业的工业物联网技术研发团队,为大型园区、楼宇、医院、学校、工厂机房等多种场景提供中央空调集成通信解决方案,根据各大空调制造商运用的不同协议,钡铼技术研发的空调采集网关目前支持大金、日立、东芝、三菱电机、海信、海尔、松下、约克、三菱重工、美的、奥克斯、博世、LG、格力等多个领先空调品牌。空调控制系统由云服务器、空调采集网关、空调设备组成。2、据测算,在正确使用空调的前提下,制冷空调温度每提高1℃,可节电8%;_空调外接网关进行数据采集的方案

经典收藏 50个jQuery Mobile开发技巧集萃-程序员宅基地

文章浏览阅读460次。1、Backbone移动实例这是在Safari中运行的一款Backbone移动应用程序。想开始体验移动开发,一个好的出发点就是关注这个应用程序的构建方式。先不妨在你的浏览器中查看该应用程序。相关链接:http://bennolan.com/2010/11/24/backbone-jquery-demo.html2、使用媒体查询来锁定设备你可能会问如何使用CSS来锁定设备(根...

C++GDI做进度条-程序员宅基地

文章浏览阅读264次。直接上代码:#include <windows.h> /* This is where all the input to the window goes to */LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { switch(Message) { /* Upon destruction, tell the main thread to stop */ ..

推荐文章

热门文章

相关标签