Verilog HDL基础

news2024/11/6 8:03:57

模块的基本结构

module 模块名(端口列表);    // 模块声明
    // 端口定义
    input   [数据类型] [位宽]  输入端口列表;           
    output [数据类型] [位宽]  输出端口列表; 
    inout   [数据类型] [位宽]  双向端口列表; 

    // 数据类型定义
    wire  [位宽] 线网名,线网名,…;     
    reg  [位宽] 变量名,变量名,…;

    //函数与任务声明
    function [位宽] 函数名; ...; endfuction
    task 任务名; ...; 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);    ……  endmodule

input 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.coloradmin.cn/o/2230919.html

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

相关文章

C语言实验 选择结构

时间&#xff1a;2024.11.2 一、实验 实验一、7-1 计算分段函数[2] #include<stdio.h> #include<math.h> int main(){float x,r;scanf("%f",&x);if(x<0){rpow((x1.0),2)2*x1.0/x;}else rpow(x,0.5);printf("f(%.2f) %.2f",x,r);retu…

六、Go语言快速入门之数组和切片

文章目录 数组和切片数组:one: 数组初始化:two: 数组的遍历:three: 多维数组:four: 将数组传递给函数 切片(Slice):one: 切片的初始化:star: new和make区别 :two: 切片的使用:three: 将切片传递给函数:four: 多维切片:four: Bytes包:four: 切片和垃圾回收 &#x1f4c5; 2024年…

【Sublime Text】格式化Json和XML

无package control解决方案 删除文件中的package control这一行并保存 下载 下载中

vue常用的修饰符有哪些

1、修饰符是什么 在Vue 中&#xff0c;修饰符处理了许多 DOM 事件的细节&#xff0c;让我们不再需要花大量的时间去处理这些烦恼的事情&#xff0c;而能有更多的精力专注于程序的逻辑处理 vue中修饰符分为以下五种 汇总修饰符说明表单lazy光标离开标签的时候&#xff0c;才会…

微服务设计模式 - 发布订阅模式(Publisher Subscriber Pattern)

微服务设计模式 - 发布订阅模式&#xff08;Publisher Subscriber Pattern&#xff09; 定义 发布-订阅模式&#xff08;Publisher-Subscriber Pattern&#xff09;是一种常见的设计模式&#xff0c;被广泛用于云计算和分布式系统中&#xff0c;以实现松散耦合的组件间通信。发…

00-开发环境 MPLAB IDE 配置

MPLAB IDE V8.83 File 菜单简介 New (CtrlN)&#xff1a; 创建一个新文件&#xff0c;用于编写新的代码。 Add New File to Project...&#xff1a; 将新文件添加到当前项目中。 Open... (CtrlO)&#xff1a; 打开现有文件。 Close (CtrlE)&#xff1a; 关闭当前打开的文件。 …

Pytorch猴痘病识别

Pytorch猴痘病识别 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 电脑系统&#xff1a;Windows11 显卡型号&#xff1a;NVIDIA Quadro P620 语言环境&#xff1a;python 3.9.7 编译器&#xff1a;jupyte…

GA/T1400视图库平台EasyCVR视频分析设备平台微信H5小程序:智能视频监控的新篇章

GA/T1400视图库平台EasyCVR是一款综合性的视频管理工具&#xff0c;它兼容Windows、Linux&#xff08;包括CentOS和Ubuntu&#xff09;以及国产操作系统。这个平台不仅能够接入多种协议&#xff0c;还能将不同格式的视频数据统一转换为标准化的视频流&#xff0c;通过无需插件的…

Kafka相关知识点(上)

为什么要使用消息队列&#xff1f; 使用消息队列的主要目的主要记住这几个关键词:解耦、异步、削峰填谷。 解耦: 在一个复杂的系统中&#xff0c;不同的模块或服务之间可能需要相互依赖&#xff0c;如果直接使用函数调用或者 API 调用的方式&#xff0c;会造成模块之间的耦合…

qt QTextEdit详解

QTextEdit是Qt框架中的一个文本编辑控件类&#xff0c;它提供了丰富的功能用于编辑和显示纯文本以及富文本。 重要方法 setPlainText(const QString &text)&#xff1a;设置纯文本内容。toPlainText()&#xff1a;获取纯文本内容。setHtml(const QString &text)&#…

大学城水电管理系统开发:Spring Boot指南

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

Github 2024-11-02 Rust开源项目日报 Top10

根据Github Trendings的统计,今日(2024-11-02统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10Python项目2Dart项目1RustDesk: 用Rust编写的开源远程桌面软件 创建周期:1218 天开发语言:Rust, Dart协议类型:GNU Affero Genera…

【android12】【AHandler】【4.AHandler原理篇ALooper类方法全解】

AHandler系列 【android12】【AHandler】【1.AHandler异步无回复消息原理篇】-CSDN博客 【android12】【AHandler】【2.AHandler异步回复消息原理篇】-CSDN博客 【android12】【AHandler】【3.AHandler原理篇AHandler类方法全解】-CSDN博客 其他系列 本人系列文章-CSDN博客…

【深度学习】CrossEntropyLoss需要手动softmax吗?

【深度学习】CrossEntropyLoss需要手动softmax吗&#xff1f; 问题&#xff1a;CrossEntropyLoss需要手动softmax吗&#xff1f;答案&#xff1a;不需要官方文档代码解释 问题&#xff1a;CrossEntropyLoss需要手动softmax吗&#xff1f; 之前用 pytorch 实现自己的网络时&…

EtherCAT转ModbusTCP相关技术

EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关https://item.taobao.com/item.htm?ftt&id822721028899 MS-GW15 概述 MS-GW15 是 EtherCAT 和 Modbus TCP 协议转换网关&#xff0c;为用户提供一种 PLC 扩展的集成解决方案&#xff0c;可以轻松容易将 Modbu…

使用Centos搭建Rocket.Chat教程

本章教程,主要介绍如何在CentOS系统上搭建Rocket.Cha。 一、Rocket.Chat是什么? Rocket.Chat 是一个开源的团队协作和通讯平台,类似于 Slack 或 Microsoft Teams。它提供了即时消息、视频会议、文件共享、以及与其他服务的集成等功能。用户可以在自己的服务器上部署 Rocket.…

jenkins 构建报错 mvn: command not found

首先安装过 maven&#xff0c;并且配置过环境变量 win r ,输入 cmd 键入 mvn -v 出现上图输出&#xff0c;则证明安装成功。 原因 jenkins 没有 maven 配置全局属性, 导致无法找到 mvn 命令。 解决方案 找到全局属性&#xff0c;点击新增&#xff0c;配置 MAVEN_HOME 路…

C++入门基础知识134—【关于C 库函数 - gmtime()】

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///C爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于C 库函数 - gmtime()的相关内容&#xf…

如何开发一个摄影行业小程序?开发一个摄影行业小程序需要哪些功能?南昌各行业小程序开发

如何开发一个摄影行业小程序&#xff1f;开发一个摄影行业小程序需要以下步骤&#xff1a; 1、需求分析&#xff1a;明确小程序的定位和功能需求&#xff0c;例如拍照、修图、分享、预约摄影师等。 2、设计界面&#xff1a;根据需求分析&#xff0c;设计小程序的用户界面&…

虚幻引擎5(UE5)学习教程

虚幻引擎5&#xff08;UE5&#xff09;学习教程 引言 虚幻引擎5&#xff08;Unreal Engine 5&#xff0c;简称UE5&#xff09;是Epic Games开发的一款强大的游戏引擎&#xff0c;广泛应用于游戏开发、影视制作、建筑可视化等多个领域。UE5引入了许多先进的技术&#xff0c;如…