初识 Verilog HDL , 什么是verilog HDL?

简介: 这是一篇关于Verilog HDL的学习笔记摘要。Verilog是一种硬件描述语言,用于数字系统的多层抽象设计,包括行为、数据流和结构。设计流程包括功能设计、Verilog描述、软件模拟、逻辑综合和硬件实现。模块是Verilog的基本单元,代表逻辑实体,通过并行运行和分层连接实现复杂系统。模块包含端口列表和定义,通过模块调用(实例化)实现子模块连接。Verilog的参数声明和预处理指令(如`define、`include和`timescale)增加了代码的可读性和灵活性。笔记指出Verilog与C语言有相似之处,易于学习。

2010年学习FPGA编程时候,写的读书笔记。 搬运到这里。




什么是verilog HDL?

      verilog是一种硬件描述语言,可以在算法级、门级到开关级的多种抽象设计层次上对数字系统建模。它可以描述设计的行为特性、数据流特性、结构组成以及包含响应监控和设计验证方面的时延和波形产生机制。此外,verilog提供了编程语言接口,通过该接口用户可以在模拟、验证期间从外部访问设计,包括模拟的具体控制和运行。

      verilog不仅定义了语法,而且对每个语法结构都定义了清晰的模拟、仿真语义。因此,用这种语言编写的模型能够使用verilog仿真器进行验证。verilog从C语言中继承了多种操作符和结构,所以从结构上看两者有很多相似之处。

设计流程:功能设计-->用verilog描述电路-->软件模拟与仿真-->考察结果--->逻辑综合-->代码下载到硬件电路--->完成。

1. 基本机构

1.1 模块

      模块(module)是verilog最基本的概念,也是v设计中的基本单元。每个v设计的系统都是由若干模块组成的。

A:模块在语言形式上是以关键词module开始,以关键词endmodule结束的一段程序。

B:模块的实际意义是代表硬件电路上的逻辑实体。

C:每个模块都实现特定的功能。

D:模块的描述方式有行为建模和结构建模之分。

E:模块之间是并行运行的。

F:模块是分层的,高层模块通过调用、连接低层模块的实例来实现复杂的功能。

G:各模块连接完成整个系统需要一个顶层模块(Top-module)。

无论多么复杂的系统,总能划分成多个小的功能模块。因此系统的设计可以按照下面三个步骤进行:

(1)把系统划分成模块;

(2)规划各模块的接口;

(3)对模块编程并连接各模块完成系统设计。

模块的结构是这样的:

module <模块名>(<端口列表>);

<定义>

<模块条目>

endmodule

其中:

模块名是模块唯一的标识符;

端口列表是输入、输出和双向端口的列表,这些端口用来与其他模块进行连接。

定义 则是一段程序,用来指定数据对象为寄存器型、存储器型、线型以及过程块,诸如函数块和任务块;

模块条目 也是一段程序,将上面定义的东东和端口组合起来,是说明这个模块要做什么的语句;

标识模块结束的endmodule之后没有分号。

需要注释时,用//即可,这和c语言一样。

1.2 模块的调用

     在做模块划分时,通常会出现这种情形:某个大的模块中包含了一个或多个功能子模块。verilog是通过模块调用或称为模块实例化的方式来实现这些子模块与高层模块的连接的。下面是通过两个NAND门实现一个与门的代码:

module AND(in1, in2, out);

input in1, in2;

output out;

wire w1;                                   //一个模块内部连线

NAND NAND1(in1, in2, w1);      //调用(实例化)一个NAND子模块

NAND NAND2(w1, w1, out);      //调用(实例化)一个NAND子模块

endmodule                                 //AND模块结束

调用模块实例的一般形式为:

<模块名><参数列表><实例名>(<端口列表>);

其中参数列表是传递到子模块的参数值,参数传递的典型应用是定义门级时延。

1.3 测试模块

2. 程序设计基础

    Verilog其实是最容易学会的一种编程语言,因为它的结构和语法都比较简单而且和C语言相似。

2.1 参数声明

    程序中经常多次出现某些数字,如延迟时间或变量的宽度,有时可能要改变这些值,这种情况下经常要用到参数。参数一经声明,就视其为一个常量,在整个仿真过程中不再改变。

parameter LINELENGTH = 132, ALL_X_S = 16'bx;

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

parameter STROBE_DELAY = (BYTE+BIT)/2;

使用参数可以提高程序的可读性,也利于修改。

2.2 预处理指令

和C相似,V也有预处理指令,不过它的预处理指令以反引号“`”开头。

(1)`define和`undef :前者相当于C中的#define,后者取消`define所做的定义。

(2)`ifdef、`else和`endif :这三个编译器指令通常一起出现,和普通的if-else结构类似,这些编译器指令用于条件编译。

(3)`include

这个`include要注意一下,它用于嵌入“内嵌文件”的内容,这里的内嵌文件通常也是verilog文件。如下所示,在文件adder.v中有如下内容:

`include "../../halfaddr.v"

module adder;

...........

endmodule

在编译时,adder.v中的`include这一行将由halfadder的内容代替。

(4)`timescale

在Verilog模型中,所有时延都用单位时间表示。`timescale编译器指令定义时延单位和时延精度,其格式为:

`timescale time_unit / time_precision

其中,time_unit和time_precision由值1、10和100以及单位s、ms、us、ns、ps和fs组成。前者定义了时延单位,后者定义了时延精度。

当设计中多个模块带有自身的`timescale编译指令时会发生什么呢?在这种情况下,模拟器总是定位在所有模块的最小时延精度上,并且所有时延都相应的换算成最小的时延精度。

小结一下:

这一章比较简单,其实verilog与C语言有许多相通之处,所以学习并掌握这种语言应该不是特别困难。

相关文章
|
网络虚拟化
VLAN(虚拟局域网)简介与配置指南
VLAN(虚拟局域网)简介与配置指南
1224 1
|
关系型数据库 MySQL Linux
Centos7升级openssl,超详细
Centos7升级openssl,超详细
3248 0
|
人工智能 编解码 芯片
告别低效沟通|让技术提问不再头疼-这套高效AI提问模板来帮你
不会向ai提问,不知道怎么提问的 可以看看
21549 1
告别低效沟通|让技术提问不再头疼-这套高效AI提问模板来帮你
|
12月前
|
网络安全 数据安全/隐私保护 Windows
分享5款小众且无广告的小工具
推荐5款小众无广告软件:Krita(绘图)、WinSCP(文件传输)、燃精灵(微信检测)、GIDOT TYPESETTER(排版)、Sketchable(手绘笔记),功能强大且专注,提升创作与工作效率。
539 0
|
消息中间件 缓存 弹性计算
纯PHP+MySQL手搓高性能论坛系统!代码精简,拒绝臃肿
本内容分享了一套经实战验证的社交系统架构设计,支撑从1到100万用户的发展,并历经6次流量洪峰考验。架构涵盖客户端层(App、小程序、公众号)、接入层(API网关、负载均衡、CDN)、业务服务层(用户、内容、关系、消息等服务)、数据层(MySQL、Redis、MongoDB等)及运维监控层(日志、监控、告警)。核心设计包括数据库分库分表、多级缓存体系、消息队列削峰填谷、CQRS模式与热点数据动态缓存。同时提供应对流量洪峰的弹性伸缩方案及降级熔断机制,并通过Prometheus实现全链路监控。开源建议结构清晰,适合大型社交平台构建与优化。
637 11
|
10月前
|
数据采集 人工智能 算法
GEO 技术落地教育与创业:周有贵博士与张弛教授共探校企协同技术赋能新路径
近日,湖南师范大学新闻传播学院张弛教授与 GEO 技术团队负责人 —— 巴黎学院人工智能博士、法国 GGI 商学院 GEO 首席技术专家周有贵,围绕 GEO 生成式引擎优化技术落地展开深度交流,为高校技术人才培养、学生创业冷启动及中小企业 AI 获客提供协同方案,对开发者社区关注的技术下沉与场景赋能具参考价值。
|
12月前
|
机器学习/深度学习 传感器 人工智能
拔俗AI预警数字化系统:让风险“看得见、防得住”的数字化哨兵
AI预警系统是企业的“数字哨兵”,通过机器学习实时分析海量数据,自动识别异常、提前预警风险,将传统“事后救火”变为“事前防火”。它更早发现、更准判断、持续进化,助力企业实现主动防御,守护业务稳定。
623 0
|
机器学习/深度学习
神经网络与深度学习---验证集(测试集)准确率高于训练集准确率的原因
本文分析了神经网络中验证集(测试集)准确率高于训练集准确率的四个可能原因,包括数据集大小和分布不均、模型正则化过度、批处理后准确率计算时机不同,以及训练集预处理过度导致分布变化。
|
网络协议 开发者 Python
Socket如何实现客户端和服务器间的通信
通过上述示例,展示了如何使用Python的Socket模块实现基本的客户端和服务器间的通信。Socket提供了一种简单且强大的方式来建立和管理网络连接,适用于各种网络编程应用。理解和掌握Socket编程,可以帮助开发者构建高效、稳定的网络应用程序。
821 10