精品教程:5个思维导图包会Verilog HDL语言!学不会你打我

嵌入式ARM 2020-07-09 00:00
[导读] 基于FPGA的SOC在嵌入式系统应用越来越广了,往往一个复杂系统使用一个单芯片基于FPGA的SOC就搞定了。比较流行的方案主要有Altera/xilinx两家的方案。要用这样的方案,首要需要掌握的是硬件描述语言。 最为流行的硬件描述语言有两种Verilog HDL/VHDL,均为IEEE标准。 Verilog HDL具有C语言基础就很容易上手,而VHDL语言则需要Ada编程基础。 另外 Verilog HDL 语言具有大量成熟的模块,从某种角度说Verilog HDL更具生命力。
本文整理了一下Verilog HDL语言技术要点,并分享给大家。 如发现有错误,欢迎留言指正。

Verilog HDL能干啥?

Verilog HDL的特点:

  • 可描述顺序执行或并行执行的程序结构
  • 用延迟表达式或事件表达式来明确地控制过程的启动时间
  • 通过命令的事件来触发其他过程的激活行为或停止行为
  • 提供了条件/循环等逻辑控制结构
  • 提供了可带参数且非零延续时间的任务程序机构
  • 提供了用于建立表达式的算术运算符、逻辑运算符和位运算符
  • 实现了完整的表示组合逻辑基本元件的原语
  • 提供了双向通路和电阻器的描述
  • 可建立MOS器件的电荷分享和衰减模型
  • 可通过结构性语句精确地建立信号模型

在学习Verilog HDL之前,先明确一下FPGA的设计抽象层次:



基本程序结构

module module_name(port_list)
    //声明各种变量、信号
    reg  //寄存器
    wire //线网
    parameter //参数
    input  //输入信号
    output //输出信号
    inout  //输入输出信号
    function //函数
    task     //任务
    ....
        
    //程序代码
    initial assignment
    always assignment
    module assignment
    gate   assignment
    UDP    assignment
    continous assignment
endmodule

启示:描述的是模块,其本质是数字电路:

  • 组合逻辑电路模块:组合逻辑电路的特点是输入的变化直接反映了输出的变化,其输出的状态仅取决于输入的当前的状态,与输入、输出的原始状态无关。

  • 时序逻辑电路模块:时序电路具有记忆功能。时序电路的特点是:输出不仅取决于当时的输入值,而且还与电路过去的状态有关。时序逻辑电路又称时序电路,主要由存储电路和组合逻辑电路两部分组成。

数据类型及运算符

变量名

变量名类似C语言,以一组字母、数字、下划线和$符号的组合,且首字符须为字母或者下划线。如

input ctrl_1;

数据类型

将四种基本数据类型整理成一张导图:



其中须注意的是,对于memory型存储单元进行读写,须指定地址,如:

reg[15:0] addr; //定义addr为16位位宽的存储器变量
addr = 1;       //ok

reg addr[15:0]; //定义addr为1位位宽的16个存储器变量
addr    = 1;    //错误
addr[0] = 1;    //正确

//又如:
reg[15:0] addr[3:1]; //定义3个位宽为16位存储器
addr[1] = 16'h0      //16'指定位宽,h 表示16进制,0
addr[2] = 16'b011    //b表示二进制

对于parameter变量的实用价值可读性比较好理解,那么可维护性怎么体现呢?

熟悉C语言编程的,联想一下宏,如果宏变了,有宏的地方全替换,这里parameter变量作用类似,如:

module Decode(A,F); 
parameter  Width=1, Polarity=1
…………… 
endmodule 
module  Top; 
wire[3:0] A4; 
wire[4:0] A5; 
wire[15:0] F16; 
wire[31:0] F32; 
Decode  #(4,0)  D1(A4,F16)
Decode  #(5)    D2(A5,F32)
Endmodule 

常量

parameter定义常量,那么对于常数,整型常量即整常数有以下四种进制表示形式:

  1. 二进制整数(b或B)
  2. 十进制整数(d或D)
  3. 十六进制整数(h或H)
  4. 八进制整数(o或O)

数字表达方式有以下三种:

  1. <位宽><进制><数字>这是一种全面的描述方式。
  2. <进制><数字>在这种描述方式中,数字的位宽采用缺省位宽(这由具体的机器系统决定,但至少32位)。
  3. <数字>在这种描述方式中,采用缺省进制十进制。

x和z值

在数字电路中,x代表不定值,z代表高阻值。不确定是啥?高阻又是啥?记住verilog描述的数字电路,那么对于一个模块的I/O就有可能是高阻,或者状态不确定。

负数:

一个数字可以被定义为负数,只需在位宽表达式前加一个减号,减号必须写在数字定义表达式的最前面。注意减号不可以放在位宽和进制之间也不可以放在进制和具体的数之间。

-8'd7  //-号直接放在最前面
8'
d-7  //这样则不正确

实数

实数可用十进制方式表述或者科学计数法描述,如:

//十进制表示
1.0
20.234
//科学计数法表示
6e-4

模块端口

  • input:模块从外界读取数据的接口,在模块内 可读不可写
  • output:模块向外部输出数据的接口,模块内部 可写不可读
  • inout:可读写数据,数据双向流动。

学习硬件描述语言,一定要时刻记住,这是描述的是电路,风格类C,但不是C!

表达式及运算符

和C语言类似,运算符也有三种:

  • 单目运算符(unary operator):可以带一个操作数,操作数放在运算符的右边。
  • 二目运算符(binary operator):可以带二个操作数,操作数放在运算符的两边。
  • 三目运算符(ternary operator):可以带三个操作,这三个操作数用三目运算符分隔开。

对于运算符,整理了一张导图:



大部分与C语言类似,除了等式运算符、位拼接运算符、缩减运算符,这里放点例子方便理解:

//缩减运算符
reg [3:0] B; 
reg C; 
C = &B; 
//相当于: 
C =( (B[0]&B[1]) & B[2] ) & B[3]; 
//位拼接运算符
{a,b[3:0],w,3’b101}
//相当于: 
{a,b[3],b[2],b[1],b[0],w,1’b1,1’b0,1’b1} 

运算符优先级

赋值语句

  • 非阻塞(Non_Blocking)赋值方式, 如 b <= a; 加粗是非阻塞的含义
    • 块结束后才完成赋值操作。
    • b的值并不是立刻就改变的。
    • 这是一种比较常用的赋值方法。
  • 阻塞(Blocking)赋值方式,如 b = a;
    • 赋值语句执行完后,块才结束。
    • b的值在赋值语句执行完后立刻就改变的。
    • 可能会产生意想不到的结果。

块语句

块语句有两种,一种是begin_end语句,通常用来标识顺序执行的语句,用它来标识的块称为顺序块。一种是 fork_join语句,通常用来标识并行执行的语句,用它来标识的块称为并行块。

顺序块

  • 块内的语句是按顺序执行的,即只有上面一条语句执行完后下面的语句才能执行。
  • 每条语句的延迟时间是相对于前一条语句的仿真时间而言的。
  • 直到最后一条语句执行完,程序流程控制才跳出该语句块。
begin 
    语句1
    语句2
    ...... 
    语句n; 
end 

并行块

  • 块内语句是同时执行的,即程序流程控制一进入到该并行块,块内语句则开始同时并行地执行。
  • 块内每条语句的延迟时间是相对于程序流程控制进入到块内时的仿真时间的。
  • 延迟时间是用来给赋值语句提供执行时序的。
  • 当按时间时序排序在最后的语句执行完后或一个disable语句执行时,程序流程控制跳出该程序块。
fork 
    语句1
    语句2
    ....... 
    语句n; 
join 

流控语句

流控语句风格与C语言类似,仅仅需要注意的有下面几点:

  • if 语句别忘了考虑else的情况,如忘了处置则最终硬件会最终产生意想不到的后果
  • 多条语句在条件内部需要用begin/end对包起来。
  • case语句与C语言也有default分支,实际使用注意处置default分支

结构说明语句

Verilog语言中的任何过程模块都从属于以下四种结构的说明语句:

  • initial说明语句:只执行一次
  • always说明语句 :是不断地重复执行
  • task说明语句
  • function说明语句

对于task/function的不同点,使用时需要注意:

  • 函数只能与主模块共用同一个仿真时间单位,而任务可以定义自己的仿真时间单位。函数的定义不能包含有任何的时间控制语句,即任何用#、@、或wait来标识的语句。
  • 函数不能启动任务,而任务能启动其它任务和函数。
  • 函数至少要有一个输入变量,而任务可以没有或有多个任何类型的变量。
  • 函数返回一个值,而任务则不返回值。
  • 函数的目的是通过返回一个值来响应输入信号的值。任务却能支持多种目的,能计算多个结果值,这些结果值只能通过被调用的任务的输出或总线端口送出
  • 在函数的定义中必须有一条赋值语句给函数中的一个内部变量赋以函数的结果值,该内 部变量具有和函数名相同的名字。

系统函数和任务

在Verilog HDL语言中每个系统函数和任务前面都用一个标识符$来加以确认,有这些系统函数和任务。

rtoi, setup, skew, setuphold, strobe, time, timefoemat, width, write, $recovery,

按字面意思理解,需要用到时查询手册即可。

编译预处理

宏定义 `define

用法:

`define 标识符(宏名) 字符串(宏内容)

如:

//类似C宏替换
`define signal hello 

与C语言宏类似,除了关键字不一样,也支持嵌套。组成宏内容的字符串不能够被以下的语句记号分隔开的,下面几点需要注意:

  • 注释行

  • 数字

  • 字符串

  • 确认符

  • 关键词

  • 双目和三目字符运算符

“文件包含”处理`include

用法:`include “文件名”

四点说明:

  • 一个`include命令只能指定一个被包含的文件,如果要包含n个文件,要用n个`include命令。注意下面的写法是非法的`include"aaa.v""bbb.v"
  • `include命令可以出现在Verilog HDL源程序的任何地方,被包含文件名可以是相对路径名,也可以是绝对路径名。例如:'include"parts/count.v"
  • 可以将多个`include命令写在一行,在`include命令行,只可以出空格和注释行。
  • 如果文件1包含文件2,而文件2要用到文件3的内容,则可以在文件1用两个`include命令分别包含文件2和文件3,而且文件3应出现在文件2之前

时间尺度 `timescale

`timescale命令用来说明跟在该命令后的模块的时间单位和时间精度。使用`timescale命令可以在同一个设计里包含采用了不同的时间单位的模块。用法:

`timescale<时间单位>/<时间精度>

//模块中所有的时间值都表示是1ns的整数倍
//1ns/ps:1纳秒/脉冲 
`timescale  1ns/1ps 

注意:如果在同一个设计里,多个模块中用到的时间单位不同,需要用到以下的时间结构:

  • 用`timescale命令来声明本模块中所用到的时间单位和时间精度。
  • 用系统任务$printtimescale来输出显示一个模块的时间单位和时间精度。
  • 用系统函数 realtime及%t格式声明来输出显示EDA工具记录的时间信息。

条件编译命令

`ifdef、`else、`endif

这与C语言用法类似,这里就不赘述了。

总结一下

Verilog HDL的语法与C语言的语法类似,但是一定要意识到Verilog HDL描述的是电路,光有代码还不够,器件可能运行的结果并不是代码想要的效果。另外要注意理解并行的概念,这里的并行是硬件在时钟驱动真的同时按照所设计的逻辑运行。一些重要的概念:

  • 阻塞〔Blocking〕和非阻塞〔Non-Blocking〕赋值的不同
  • 顺序块和并行块的不同
  • 块与块之间的并行执行的概念;
  • task和function的概念。

那么最好的学习办法是什么呢?写代码、仿真、综合、优化布局布线,挖坑、踩坑、填坑,在错误中总结,渐进明晰、不断实践总结。

本文授权转载自公众号“嵌入式客栈”,作者逸珺


-END-



推荐阅读



【01】图文并茂,一次搞定C语言结构体内存对齐!(包含完整源码)
【02】程序又被人白嫖了!你的MCU加密了吗?
【03】一个动画让你看懂戴森里面的直流无刷电机!
【04】呵呵,一个Bug你改了两天,真有这么难吗?
【05】后MATLAB时代的七种开源替代,一种堪称完美!


免责声明:整理文章为传播相关技术,版权归原作者所有,如有侵权,请联系删除
嵌入式ARM 关注这个时代最火的嵌入式ARM,你想知道的都在这里。
评论
  • 近日,搭载紫光展锐W517芯片平台的INMO GO2由影目科技正式推出。作为全球首款专为商务场景设计的智能翻译眼镜,INMO GO2 以“快、准、稳”三大核心优势,突破传统翻译产品局限,为全球商务人士带来高效、自然、稳定的跨语言交流体验。 INMO GO2内置的W517芯片,是紫光展锐4G旗舰级智能穿戴平台,采用四核处理器,具有高性能、低功耗的优势,内置超微高集成技术,采用先进工艺,计算能力相比同档位竞品提升4倍,强大的性能提供更加多样化的应用场景。【视频见P盘链接】 依托“
    紫光展锐 2024-12-11 11:50 78浏览
  • 全球智能电视时代来临这年头若是消费者想随意地从各个通路中选购电视时,不难发现目前市场上的产品都已是具有智能联网功能的智能电视了,可以宣告智能电视的普及时代已到临!Google从2021年开始大力推广Google TV(即原Android TV的升级版),其他各大品牌商也都跟进推出搭载Google TV操作系统的机种,除了Google TV外,LG、Samsung、Panasonic等大厂牌也开发出自家的智能电视平台,可以看出各家业者都一致地看好这块大饼。智能电视的Wi-Fi连线怎么消失了?智能电
    百佳泰测试实验室 2024-12-12 17:33 67浏览
  • 铁氧体芯片是一种基于铁氧体磁性材料制成的芯片,在通信、传感器、储能等领域有着广泛的应用。铁氧体磁性材料能够通过外加磁场调控其导电性质和反射性质,因此在信号处理和传感器技术方面有着独特的优势。以下是对半导体划片机在铁氧体划切领域应用的详细阐述: 一、半导体划片机的工作原理与特点半导体划片机是一种使用刀片或通过激光等方式高精度切割被加工物的装置,是半导体后道封测中晶圆切割和WLP切割环节的关键设备。它结合了水气电、空气静压高速主轴、精密机械传动、传感器及自动化控制等先进技术,具有高精度、高
    博捷芯划片机 2024-12-12 09:16 87浏览
  • 本文介绍瑞芯微RK3588主板/开发板Android12系统下,APK签名文件生成方法。触觉智能EVB3588开发板演示,搭载了瑞芯微RK3588芯片,该开发板是核心板加底板设计,音视频接口、通信接口等各类接口一应俱全,可帮助企业提高产品开发效率,缩短上市时间,降低成本和设计风险。工具准备下载Keytool-ImportKeyPair工具在源码:build/target/product/security/系统初始签名文件目录中,将以下三个文件拷贝出来:platform.pem;platform.
    Industio_触觉智能 2024-12-12 10:27 81浏览
  • 应用环境与极具挑战性的测试需求在服务器制造领域里,系统整合测试(System Integration Test;SIT)是确保产品质量和性能的关键步骤。随着服务器系统的复杂性不断提升,包括:多种硬件组件、操作系统、虚拟化平台以及各种应用程序和服务的整合,服务器制造商面临着更有挑战性的测试需求。这些挑战主要体现在以下五个方面:1. 硬件和软件的高度整合:现代服务器通常包括多个处理器、内存模块、储存设备和网络接口。这些硬件组件必须与操作系统及应用软件无缝整合。SIT测试可以帮助制造商确保这些不同组件
    百佳泰测试实验室 2024-12-12 17:45 74浏览
  • 天问Block和Mixly是两个不同的编程工具,分别在单片机开发和教育编程领域有各自的应用。以下是对它们的详细比较: 基本定义 天问Block:天问Block是一个基于区块链技术的数字身份验证和数据交换平台。它的目标是为用户提供一个安全、去中心化、可信任的数字身份验证和数据交换解决方案。 Mixly:Mixly是一款由北京师范大学教育学部创客教育实验室开发的图形化编程软件,旨在为初学者提供一个易于学习和使用的Arduino编程环境。 主要功能 天问Block:支持STC全系列8位单片机,32位
    丙丁先生 2024-12-11 13:15 71浏览
  • 在智能化技术快速发展当下,图像数据的采集与处理逐渐成为自动驾驶、工业等领域的一项关键技术。高质量的图像数据采集与算法集成测试都是确保系统性能和可靠性的关键。随着技术的不断进步,对于图像数据的采集、处理和分析的需求日益增长,这不仅要求我们拥有高性能的相机硬件,还要求我们能够高效地集成和测试各种算法。我们探索了一种多源相机数据采集与算法集成测试方案,能够满足不同应用场景下对图像采集和算法测试的多样化需求,确保数据的准确性和算法的有效性。一、相机组成相机一般由镜头(Lens),图像传感器(Image
    康谋 2024-12-12 09:45 86浏览
  • RK3506 是瑞芯微推出的MPU产品,芯片制程为22nm,定位于轻量级、低成本解决方案。该MPU具有低功耗、外设接口丰富、实时性高的特点,适合用多种工商业场景。本文将基于RK3506的设计特点,为大家分析其应用场景。RK3506核心板主要分为三个型号,各型号间的区别如下图:​图 1  RK3506核心板处理器型号场景1:显示HMIRK3506核心板显示接口支持RGB、MIPI、QSPI输出,且支持2D图形加速,轻松运行QT、LVGL等GUI,最快3S内开
    万象奥科 2024-12-11 15:42 88浏览
  • 首先在gitee上打个广告:ad5d2f3b647444a88b6f7f9555fd681f.mp4 · 丙丁先生/香河英茂工作室中国 - Gitee.com丙丁先生 (mr-bingding) - Gitee.com2024年对我来说是充满挑战和机遇的一年。在这一年里,我不仅进行了多个开发板的测评,还尝试了多种不同的项目和技术。今天,我想分享一下这一年的故事,希望能给大家带来一些启发和乐趣。 年初的时候,我开始对各种开发板进行测评。从STM32WBA55CG到瑞萨、平头哥和平海的开发板,我都
    丙丁先生 2024-12-11 20:14 78浏览
  • 习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记
    youyeye 2024-12-11 17:58 88浏览
  • 一、SAE J1939协议概述SAE J1939协议是由美国汽车工程师协会(SAE,Society of Automotive Engineers)定义的一种用于重型车辆和工业设备中的通信协议,主要应用于车辆和设备之间的实时数据交换。J1939基于CAN(Controller Area Network)总线技术,使用29bit的扩展标识符和扩展数据帧,CAN通信速率为250Kbps,用于车载电子控制单元(ECU)之间的通信和控制。小北同学在之前也对J1939协议做过扫盲科普【科普系列】SAE J
    北汇信息 2024-12-11 15:45 115浏览
  • 习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记
    youyeye 2024-12-12 10:13 50浏览
  • 时源芯微——RE超标整机定位与解决详细流程一、 初步测量与问题确认使用专业的电磁辐射测量设备,对整机的辐射发射进行精确测量。确认是否存在RE超标问题,并记录超标频段和幅度。二、电缆检查与处理若存在信号电缆:步骤一:拔掉所有信号电缆,仅保留电源线,再次测量整机的辐射发射。若测量合格:判定问题出在信号电缆上,可能是电缆的共模电流导致。逐一连接信号电缆,每次连接后测量,定位具体哪根电缆或接口导致超标。对问题电缆进行处理,如加共模扼流圈、滤波器,或优化电缆布局和屏蔽。重新连接所有电缆,再次测量
    时源芯微 2024-12-11 17:11 117浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦