Verilog HDL基础

模块的基本结构

module 模块名(端口列表);    // 模块声明// 端口定义input   [数据类型] [位宽]  输入端口列表;           output [数据类型] [位宽]  输出端口列表; inout   [数据类型] [位宽]  双向端口列表; // 数据类型定义wire  [位宽] 线网名,线网名,…;     reg  [位宽] 变量名,变量名,…;//函数与任务声明function [位宽] 函数名; ...; endfuctiontask 任务名; ...; endtask// 功能描述 assign 线网名=函数表达式;            // 数据流描述方式always/initial过程语句;                // 行为描述方式例化模块名 实例名(端口关联列表);    // 结构描述方式endmodule

1. 模块声明

  模块声明以关键词module开始,以endmodule结束。模块声明由模块名和端口列表两部分组成。  4选一数据选择器的模块声明参考如下:  

module MUX4to1(d0,d1,d2,d3,a,y);     ……   endmodule

其中指定模块名为MUX4to1,对外共有四路数据d0、d1、d2和d3,两位地址a和输出y共6组端口。

  模块的所有代码书写于关键词module和endmodule之间,包括端口定义、数据类型定义、函数和任务声明以及功能描述部分。

2. 端口定义

  端口类型定义用于指定模块对外端口的数据流动方向以及数据类型。 具体的语法格式为:
 

input [wire] [msb:lsb]  输入端口名x1,输入端口名x2,…;output [wire/reg] [msb:lsb] 输出端口名y1,输出端口名y2,…;inout [wire/reg] [msb:lsb]  双向口名z1,双向口名z2,…;module MUX4to1(d0,d1,d2,d3,a,y);    ……  endmoduleinput d0,d1,d2,d3;  // 4路数据input [1:0] a;         // 2位地址output wire/reg y;         // 输出 
 module MUX4to1( input d0,d1,d2,d3,input [1:0] a,     output wire/reg y            );   

3. 数据类型定义

   数据类型(Data Type)用于:

(1)指定模块端口的数据类型;        

(2)定义模块内部的物理连线或者具有存储作用的数据单元。

数据类型定义的语法格式为: wire [msb:lsb] 线网名1,线网名2,…; reg [msb:lsb] 变量名1,变量名2,…;

// 定义4个内部线网
wire atmp,btmp,ctmp,dtmp;
// 定义计数变量
reg [3:0] q; 
module MUX4to1 ( input d0,d1,d2,d3,input [1:0] a,     output wire/reg y            );   

 需要说明的是:

(1)模块的输入口为wire类型;

(2)模块的端口没有显式说明为reg类型时,默认为wire类型;

(3)输出口/双向口可以被定义为reg类型,而且reg变量的位宽必须与端口类型定义中的位宽严格一致;  

4. 功能描述

  功能描述用于描述模块的逻辑功能或者说明模块的结构,有数据流描述、行为描述和结构描述三种方法。

  数据流描述应用连续赋值语句(在关键词assign后加表达式的方法或者应用操作符)描述线网的逻辑功能。

 module MUX4to1 ( input d0,d1,d2,d3,input [1:0] a,     output wire y );   wire atmp,btmp,ctmp,dtmp;
根据4选一数据选择器的逻辑函数表达式Y=D0A1'A0'+D1A1'A0+D2A1A0'+D3A1A0
可以直接写出4选一数据选择器的数据流描述为assign atmp = d0 && !a[1] && !a[0];assign btmp = d1 && !a[1] &&  a[0];assign ctmp = d2 &&  a[1] && !a[0]; assign dtmp = d3 &&  a[1] &&  a[0];assign y = atmp || btmp || ctmp || dtmp;
式中“&&”表示逻辑与,”||”表示逻辑或,“!”表示逻辑非。 

  行为描述使用(initial/always)过程语句对模块的功能进行描述,其中always语句是Verilog中最具有特色的过程语句,既可以用于描述组合逻辑电路,也可以用于描述时序逻辑电路。

always语句是反复执行的,过程内部用高级语句来描述模块的逻辑功能。

用always语句描述4选一数据选择器:

always @(d0 or d1 or d2 or d3 or a) case (a)  //根据地址a进行分支2'b00:   y=d0;2'b01:   y=d1;2'b10:   y=d2;2'b11:   y=d3;default:  y=d0;endcase

用always语句描述4选一数据选择器时,还需要将输出y显式地定义为寄存器变量,即需要在数据类型定义部分添加下述语句:

module MUX4to1 (d0,d1,d2,d3,a,y); input d0,d1,d2,d3;input [1:0] a;     output y;            reg y; 

  结构描述是调用Verilog中内置的门级原语(primitive,门级或开关级元件)、用户定义的功能模块或者宏功能模块来描述模块内部器件之间的连接关系,用于对模块的结构进行说明。

结构描述的语法格式为: 调用模块名 [实例名](端口关联列表);

wire atmp,btmp,ctmp,dtmp;
and  U1_and (atmp,d0,!a[1],!a[0]);  //调用基元and,实现atmp=D0A1'A0'
and  U2_and (btmp,d1,!a[1], a[0]);  //调用基元and,实现btmp=D1A1'A0
and  U3_and (ctmp,d2, a[1],!a[0]);  //调用基元and,实现ctmp=D2A1A0'
and  U4_and (dtmp,d3, a[1], a[0]);  //调用基元and,实现dtmp=D3A1A0'
or  U_or (y,atmp,btmp,ctmp,dtmp); //调用基元or,实现y=atmp+btmp+ctmp+dtmp

Verilog 语法元素

  Verilog HDL代码由大量的基本语法元素构成,包括空白符和注释、数值和字符串、标识符和关键字词等。

   Verilog从C语言发展而来,保留了C语言的语法特点。例如,空白符(空格键或者TAB)、和注释(//...或者/*...*/)方法与C语言完全相同,标识符同样区分大小写等。但是,Verilog本质上是用来描述硬件电路的,所以也有许多与C语言不同之处,例如线网/变量的概念和取值以及操作符等。

  Verilog为线网/变量定义了4种基本取值:0、1、x和z,基本含义如右表所示。其中x表示未知,通常用在测试平台文件中,表示没有经过初始化的输入端口的值。

常量表示方法

常量按照其数值类型的不同可划分为整数常量、实数常量和字符串三种类型。

  实数常量既可以用带小数点的十进制数表示,也可以用科学计数法表示。带小数点的实数在小数点两侧都必须至少有一位数字。

  字符串定义为双引号内的字符序列,用 ASCII 码序列表示,其中每个字表示为一个 8 位 ASCII 码。

reg [12*8:1] str1; 
reg [14*8:1] str2; 
...
str1=”Hello world!”;
str2= ”Internal error”

参数定义语句

   Verilog使用参数定义语句定义常量,用标识符表示具体的常量值,用于指定数据的位宽、延迟量和状态编码等参数,以提高代码的可阅读性、可维护性以及模块的复用性。

参数定义语句的语法格式如下: parameter 参数名1=常数或常数表达式1,参数名2=常数或常数表达式2,…; localparam 参数名1=常数或常数表达式1,参数名2=常数或常数表达式2,…;

parameter MSB=7, LSB=0;  // 定义参数MSB和LSB,值分别为7和0
localparam DELAY=10;       // 定义参数DELAY,值为10
...
reg [MSB:LSB] cnt_q;     // 引用参数MSB和LSB定义cnt_q的位宽
and #DELAY (y,a,b);       // 引用参数DELAY定义赋值的延迟时间

  参数定义语句parameter/localparam通常写在模块内部,只对当前模块起作用。

标识符与关键词

 Verilog中的标识符应符合以下三条基本规定:  

(1)由大小写字母、数字、$和_(下划线)组成;  

(2)以字母或下划线开头,中间可以使用下划线,但不能连续使用下划线,也不能以下划线结束;  

(3)长度小于1024。

 合法的标识符:MUX4to1,d0,d1,d2,d3,a,y;                  Clk_100MHz,WR_n,_CE,P1_2。

非法的标识符:64bits,ROM__dat,ROM-dat

   Verilog HDL中预先保留了许多用于定义语言结构的特殊标识符,称为关键词(keywords),具有特定的含义,如module、endmodule、input、output、inout、wire、reg、integer、real、initial、always、begin、end、if、else、case、casex、casez、endcase、for、repeat、while和forever等。  

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS NEXT 应用开发实战(九、知乎日报项目详情页实现详细介绍)

在本篇博文中,我们将探讨如何使用 HarmonyOS Next 框架开发一个知乎日报的详情页,逐步介绍所用到的组件及代码实现。知乎日报是个小巧完整的小项目,这是一个循序渐进的过程,适合初学者和有一定开发经验的工程师参考。 1. 项目背景…

SpringBoot+FileBeat+ELK8.x版本收集日志

一、准备环境 1、ElasticSearch:8.1.0 2、FileBeat:8.1.0 3、Kibana:8.1.0 4、logstach:8.1.0 本次统一版本:8.1.0,4个组件,划分目录,保持版本一致。 说明:elasticsearch和kib…

UML介绍-不同类间关系

目录 不同的类间关系有着各自独特的体现方式。 继承关系 实现关系 关联关系 聚合关系 组合关系 数据库建模PowerDesigner UML(Unified Modeling Language)即统一建模语言,是一种用于软件系统分析、 设计和文档编制的可视化建模语言。…

C语言 | Leetcode C语言题解之第528题按权重随机选择

题目: 题解: typedef struct {int* pre;int preSize;int total; } Solution;Solution* solutionCreate(int* w, int wSize) {Solution* obj malloc(sizeof(Solution));obj->pre malloc(sizeof(int) * wSize);obj->preSize wSize;obj->total…

Yocto 项目中 layer.conf 文件的基本框架与模版

一个在layer.conf文件的基本框架: # 层的名称,可自定义,用于标识该层 LCONF_VERSION "7" LAYERNAME "my_layer"# 层的优先级,整数,用于确定层在构建顺序中的位置 # 数字越大,优先级…

计算机毕业设计Hadoop+大模型地震预测系统 地震数据分析可视化 地震爬虫 大数据毕业设计 Spark 机器学习 深度学习 Flink 大数据

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

移植 AWTK 到 纯血鸿蒙 (HarmonyOS NEXT) 系统 (1) - 让 OpenGLES 应用跑起来

在正式移植 AWTK 之前,我们先尝试在 HarmonyOS 上运行一个简单的 OpenGLES 应用程序。虽然可以确定这一步肯定是可行的,但是作为一个 HarmonyOS NEXT 新手,还是先从简单的应用程序开始,把坑都踩一遍,遇到问题比较好解决…

Node.js:内置模块

Node.js:内置模块 Node.jsfs模块读取文件写入文件__dirname path模块路径拼接文件名解析 http模块创建服务 Node.js 传统的JavaScript是运行在浏览器的,浏览器就是其运行环境。 浏览器提供了JavaScript的API,以及解析JavaScript的解析引擎&a…

《Web性能权威指南》-WebRTC-读书笔记

本文是《Web性能权威指南》第四部分——WebRTC的读书笔记。 第一部分——网络技术概览,请参考网络技术概览; 第二部分——无线网络性能,请参考无线网络性能; 第三部分——HTTP,请参考HTTP; 第四部分——浏览…

vscode ssh连接autodl失败

autodl服务器已开启,vscode弹窗显示连接失败 0. 检查状态 这里的端口和主机根据自己的连接更改 ssh -p 52165 rootregion-45.autodl.pro1. 修改config权限 按返回的路径找到config文件 右键--属性--安全--高级--禁用继承--从此对象中删除所有已继承的权限--添加…

HTML 基础标签——多媒体标签<img>、<object> 与 <embed>

文章目录 1. `<img>` 标签主要属性示例注意事项2. `<object>` 标签概述主要属性示例注意事项3. `<embed>` 标签概述主要属性示例注意事项小结在现代网页设计中,多媒体内容的使用变得越来越重要,因为它能够有效增强用户体验、吸引注意力并传达信息。HTML 提…

Android——横屏竖屏

系统配置变更的处理机制 为了避免横竖屏切换时重新加载界面的情况&#xff0c;Android设计了一中配置变更机制&#xff0c;在指定的环境配置发生变更之时&#xff0c;无需重启活动页面&#xff0c;只需执行特定的变更行为。该机制的视线过程分为两步&#xff1a; 修改 Androi…

宝塔使用clickhouse踩坑

前言 最近有个物联网项目&#xff0c;需要存储物联网终端发送过来的信息&#xff08;类似log日志&#xff0c;但又要存储在数据库里&#xff0c;方便后期聚合统计&#xff09;&#xff0c;本来想写文件的奈何客户要求聚合统计&#xff0c;所以只能用数据库才能达到更高的计算效…

探索Python新境界:Buzhug库的神秘面纱

文章目录 探索Python新境界&#xff1a;Buzhug库的神秘面纱第一部分&#xff1a;背景介绍第二部分&#xff1a;Buzhug库是什么&#xff1f;第三部分&#xff1a;如何安装Buzhug库&#xff1f;第四部分&#xff1a;Buzhug库函数使用方法第五部分&#xff1a;Buzhug库使用场景第六…

跨越科技与文化的桥梁——ROSCon China 2024 即将盛大开幕

在全球机器人技术飞速发展的浪潮中&#xff0c;ROS&#xff08;Robot Operating System&#xff09;作为一款开源的机器人操作系统&#xff0c;已成为无数开发者、研究人员和企业的首选工具。为了进一步推动ROS的应用与发展&#xff0c;全球知名的机器人操作系统会议——ROSCon…

ZDS 数字股票 布局全球视野,开启智能金融新篇章

在全球金融市场蓬勃发展的背景下&#xff0c;Zeal Digital Shares&#xff08;ZDS&#xff09;正迈向一个全新的发展阶段。通过采用先进技术与深度融合人工智能&#xff08;AI&#xff09;&#xff0c;ZDS 吸引了各类顶尖人才&#xff0c;不仅推动了创新金融服务的建设&#xf…

Python酷库之旅-第三方库Pandas(190)

目录 一、用法精讲 881、pandas.Index.is_方法 881-1、语法 881-2、参数 881-3、功能 881-4、返回值 881-5、说明 881-6、用法 881-6-1、数据准备 881-6-2、代码示例 881-6-3、结果输出 882、pandas.Index.min方法 882-1、语法 882-2、参数 882-3、功能 882-4、…

LSTM模型改进实现多步预测未来30天销售额

项目源码获取方式见文章末尾&#xff01; 600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【BiLSTM模型实现电力数据预测】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实…

三周精通FastAPI:27 使用使用SQLModel操作SQL (关系型) 数据库

官网文档&#xff1a;https://fastapi.tiangolo.com/zh/tutorial/sql-databases/ SQL (关系型) 数据库 FastAPI不需要你使用SQL(关系型)数据库。 但是您可以使用任何您想要的关系型数据库。 这里我们将看到一个使用SQLModel的示例。 SQLModel是在SQLAlchemy和Pydantic的基础…

C语言 ——— 学习和使用 strstr 函数,并模拟实现

目录 strstr 函数的作用 学习 strstr 函数​编辑 使用 strstr 函数 模拟实现 strstr 函数 strstr 函数的作用 查找子字符串 返回指向 str1 中第一次出现的 str2 的指针&#xff0c;如果 str2 不是 str1 的一部分&#xff0c;则返回 null 指针 学习 strstr 函数 函数的参数…