【Verilog HDL】FPGA-Verilog文件的基本结构

news2024/9/22 9:42:00

🎉欢迎来到FPGA专栏~Verilog文件的基本结构


  • ☆* o(≧▽≦)o *☆~我是小夏与酒🍹
  • 博客主页:小夏与酒的博客
  • 🎈该系列文章专栏:FPGA学习之旅
  • 文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏
  • 📜 欢迎大家关注! ❤️
    FPGQ2

CSDN

🎉 Verilog文件的基本结构

  • 一、Verilog模块的基本结构
  • 二、语法详细介绍
    • 2.1 模块定义
    • 2.2 端口声明
    • 2.3 内部资源声明
    • 2.4 功能描述
  • 三、其余基础语法
    • 3.1 assign语句简单介绍
    • 3.2 位操作

遇见未来

Verilog HDL系列博客参考书籍 《Verilog HDL设计实用教程》小梅哥教学视频。该系列博客将会融合两部分参考内容,总结知识点,帮助新手快速掌握Verilog HDL。

一、Verilog模块的基本结构

实现一个2-4译码器的Verilog代码:

//2-4译码器的Verilog代码
module decode2x4(Z,A,B,Enable);
	output [3:0]Z;
	input A,B,Enable;
	wire A_n,B_n;
	
	not		V0(A_n,A);
	not 	V1(B_n,B);
	nand	N0(Z[3],Enable,A,B);
	nand	N1(Z[0],Enable,A_n,B_n);
	nand	N2(Z[1],Enable,A_n,B);
	nand	N3(Z[2],Enable,A,B_n);
		
endmodule 

上述代码编写了一个2-4译码器的模块,基本包含了所有Verilog代码的通用结构。该模块的代码由四部分组成:模块定义、端口声明、内部资源声明和功能描述

模块定义部分的代码:

//2-4译码器的Verilog代码
module decode2x4(Z,A,B,Enable);
...
endmodule 

端口声明部分的代码:

output [3:0]Z;
input A,B,Enable;

内部资源声明部分的代码:

wire A_n,B_n;

功能描述部分的代码:

not		V0(A_n,A);
not 	V1(B_n,B);
nand	N0(Z[3],Enable,A,B);
nand	N1(Z[0],Enable,A_n,B_n);
nand	N2(Z[1],Enable,A_n,B);
nand	N3(Z[2],Enable,A,B_n);

需要记住一个Verilog模块由四个部分组成。模块定义、端口声明、内部资源声明和功能描述四个部分构成一个完整的模块。

二、语法详细介绍

2.1 模块定义

模块的定义以关键字module开始,以关键字endmodule结束,在这两个关键字之间的代码被识别为一个模块,即一个具有某种基本功能的电路模型,其基本语法结构如下:

//模块的定义
module 模块名(端口名1,端口名2,端口名3...);
...
endmodule 

对于Verilog模块的定义需要注意如下三点:
🔸第一点: 一个Verilog文件中可以定义多个模块,但是为了便于文件的管理和模块的调用,一般情况下一个Verilog文件中只定义并编写一个模块。

//一个Verilog文件中定义多个模块
module mux2(a,b,sel,out,io);
...
endmodule 

module mux4(a,b,sel,out,io);
...
endmodule 

module mux8(a,b,sel,out,io);
...
endmodule 

...

🔸第二点: 在定义模块的同时,需要自己定义模块名和端口名。而对于端口名的写法,常用的有两种。

//第一种写法
module mux2 (a,b,sel,out,io)
//端口属性定义
	input [7:0] a;
	input [7:0] b;
	input sel;
	output [7:0] out;
	inout io;

	...
		
endmodule
//第二种写法
//Verilog对于端口列表的新写法
module mux2 (
//端口属性定义
	input [7:0] a,
	input [7:0] b,
	input sel,
	output [7:0] out,
	inout io
);

	...
	
endmodule

第二种写法将端口的类型(属性)直接写到了端口名部分。推荐使用第二种写法,便于管理、检查和调用

使用第二种写法编写2-4译码器:

//2-4译码器的Verilog代码
module decode2x4(
	output	[3:0] Z,
	input		  A,
	input		  B,
	input		  Enable
);

	wire A_n;
	wire B_n;
	
	not		V0(A_n,A);
	not 	V1(B_n,B);
	nand	N0(Z[3],Enable,A,B);
	nand	N1(Z[0],Enable,A_n,B_n);
	nand	N2(Z[1],Enable,A_n,B);
	nand	N3(Z[2],Enable,A,B_n);
		
endmodule 

🔸第三点: 模块的名称、端口的名称等需要自己来定义的名称,统称为标识符

标识符使用的规则:

  1. 标识符区分大小写,例如:Cnt和cnt是不同的。
  2. 标识符的第一个字符必须是字母或下画线,不能以数字或美元符开始。
  3. Verilog基本语法中使用到的关键字作为保留字,是不能用作标识符的。

2.2 端口声明

端口声明,即给出端口的具体信息,包括输入输出和位宽情况。

端口的类型有三种,分别是:inputoutputinout

端口类型关键字
输入端口input
输出端口output
双向端口inout

端口定义时默认一位宽度,即只能传播一位信号。

指定端口的位宽:

端口类型 [端口位宽左界:端口位宽右界] 端口名

例如:

module mux2 (
//端口属性定义
	input [7:0] a,
	input [7:0] b,
	input sel,
	output [7:0] out,
	inout io
);

	...
	
endmodule

2.3 内部资源声明

对于内部资源的声明,比较常见的是连线(线网)类型寄存器类型

🔸时序逻辑驱动的信号-寄存器类型reg。
🔸组合逻辑驱动的信号-线网类型wire。

需要在always块中进行赋值时,必须定义为reg类型。

例如:

//定义内部信号
wire oe;
reg [7:0] y;
reg [7:0]shift_a;
always@(posedge clk)
	shift_a <= {shift_a[0],shift_a[7:1]};

连线和寄存器的最初目的是描述电路中的连接线(就是导线)和寄存器(数字电路基本时序器件)。wire最后一定会变成连线,而reg则不一定真的会变成寄存器。

2.4 功能描述

功能描述部分是Verilog最主要的一个部分。

功能描述部分就是要完成该模块能实现的功能。该部分会在后续的文章中逐步讲解。

三、其余基础语法

3.1 assign语句简单介绍

assign语句,即连续赋值语句。

对于二选一多路器的功能描述,如下的assign语句都是等价的:

//连续赋值语句
assign out = (sel == 0)?a:b;

//简化写法
assign out = !sel?a:b;

//等价写法
assign out = sel?b:a;

FPGA实现二选一多路器链接:【FPGA零基础学习之旅#2】“二选一多路器”简单实例

assign语句实现三态门的控制:

//三态门控制
inout io;
assign oe = sel;
assign io = oe?out[0]:1'bz;//z表示高阻态,高阻态表示输入

3.2 位操作

🔸对于数据的表示:

//位宽的表示
//数据的表示
assign x = 4'b1001;//1001(2)=9(10)
assign x = 4'd9;
assign x = 4'h9;

assign x = 4'hc;

assign n = 32'h1234_4567;
assign z = 8'b1001_1011;

在上述代码的例子中,如assign x = 4'b1001;//1001(2)=9(10)4表示数据的位宽,b表示数据类型为二进制数,1001即为数据(二进制的1001等于十进制的9)

b表示二进制;d表示十进制;h表示十六进制。位宽与进制之间用 分隔开

🔸对于位的操作:
这里介绍Verilog中的三种位操作:取某一位直接用作数据源循环移位操作位拼接操作

  1. 取某一位直接用作数据源:
//取某一位直接用作数据源
output [7:0] out;
wire [2:0]m;
assign m = out[5:3];
  1. 循环移位操作:
//循环移位操作
reg [7:0]shift_a;
always@(posedge clk)
	shift_a <= {shift_a[0],shift_a[7:1]};
  1. 位拼接操作:
//位拼接操作,“{}”表示拼接
wire [3:0]x;
wire [3:0]y;
wire [7:0]z;
wire [31:0]n;

assign z = {x,y};

//下面两种写法等效
assign n = {y,7{x}};
assign n = {y,x,x,x,x,x,x,x};

csdn

🧸结尾


  • ❤️ 感谢您的支持和鼓励! 😊🙏
  • 📜您可能感兴趣的内容:
  • 【FPGA-Spirit_V2】基于FPGA的循迹小车-小精灵V2开发板
  • 【Go黑帽子】使用Golang编写一个TCP扫描器(高级篇)
  • 【Arduino TinyGo】【最新】使用Go语言编写Arduino-环境搭建和点亮LED灯
  • 【Labview-3D虚拟平台】Labview与Solidworks联合仿真(保姆级)(下)装配体、父级与子级
    遇见未来

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

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

相关文章

SSM框架MyBatis 三种分页查询 PageHlper的使用以及五个参数的简单解释

SSM框架MyBatis 三种简单的分页查询 1. 基础分页查询&#xff08;环境在第一天的配置中有&#xff09; mapper也就是dao //查询总数Select("select count(*) from book;")int selectCount();//分页查询Select("select * from book limit #{currpage},#{size}&q…

windows快捷键汇总

Windows 系统中有很多常用的快捷键&#xff0c;这些快捷键可以帮助我们快速完成一些操作&#xff0c;提高我们的工作效率。下面是一些使用 Windows 快捷键的好处和长期利弊&#xff1a; 好处&#xff1a; 可以快速完成一些操作&#xff0c;提高工作效率。可以让我们的工作更加…

2023年RHCE第二次作业

1.配置ntp时间服务器&#xff0c;确保客户端主机能和服务主机同步时间 2.配置ssh免密登陆&#xff0c;能够通过客户端主机通过redhat用户和服务端主机基于公钥验证方式进行远程连接 1配置Chrony服务器 先下载chrony--------dnf install -y chrony 查看和配置chrony.conf文件 …

Centos7 安装mysql 8.0.32版本(解压glibc版本)

Centos 7 安装 MySQL 8.0.32 glibc 版本总结 Centos7中安装MySQL服务时&#xff0c;首先需要卸载掉mariadb&#xff0c;mariadb可能会与MySQL产生冲突。 1、卸载mariadb 查找mariadb是否已经安装&#xff08;默认已经安装&#xff09; rpm -qa | grep mariadb接下来将查找到…

QWidget改变背景图的方法和坑

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、添加背景图资源文件二、使用 QPalette三、重写paintEvent() 函数四、使用QT的设计师界面总结 前言 本篇文章将讲解QWidget改变背景图的方法和会遇到的问题…

Flutter插件开发-(基础篇)

在开发flutter项目的时分通常会运用一些三方的的packages或许plugin&#xff0c;二者的区别&#xff1a;packages主要是包括的Dart代码块&#xff0c;而plugin则包括iOS和android的代码。 因此来说创立plugin和packages的流程是相似的&#xff0c;下面就以创立plugin为例进行展…

Spring原理学习(六):Spring实现动态代理时对jdk和cglib的选择

目录 〇、前言 一、AOP中的一些基本概念 二、两个切面的概念 三、advisor的使用 3.1 前置知识 3.2 使用步骤 四、spring对jdk和cglib的统一 〇、前言 对jdk和cglib 实现动态代理的原理不清楚的兄弟们&#xff0c;可以参考前文&#xff1a;Spring原理学习&#xff08;…

Python+Qt人脸识别职工录入管理系统

程序示例精选 PythonQt人脸识别职工录入管理系统 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<PythonQt人脸识别职工录入管理系统>>编写代码&#xff0c;代码整洁&#xff0c…

【FTP】——文件传输协议

文章目录 1.FTP简介1.1 FTP概述1.2 FTP主动模式1.3 FTP被动模式 2. 实例&#xff1a;匿名用户访问FTP服务3. 实例&#xff1a;本地用户访问FTP服务 1.FTP简介 1.1 FTP概述 FTP服务——用来传输文件的协议。 FTP服务器默认使用TCP协议的20、21端口与客户端进行通信. 20端口…

【学习笔记】Linux基础

Linux基础 一、操作系统1、什么是操作系统2、Linux操作系统3、Linux系统目录&#xff0c;Linux倒挂树型目录结构&#xff1a;4、安装Xshell与Xftp5、Linux文件操作命令6、vim文本编辑器&#xff08;1&#xff09;vim三种模式&#xff08;2&#xff09;vim重要快捷键&#xff08…

Dell Inspiron 5570电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。&#xff08;下载请直接百度黑果魏叔&#xff09; 硬件型号驱动情况 主板Dell Inspiron 5570 处理器Intel(R) Core(TM) i7-8550U CPU 1.80GHz已驱动 内存8 GB 2400 MHz DDR4已驱动 硬盘samsung ssd 850 evo 250 go已驱…

汽车跨界还能这么玩?解锁汽车跨界新模式

跨界&#xff0c;是一种商业思维&#xff0c;是出圈方式&#xff0c;是进入流量红海的手段之一。近几年来&#xff0c;国内掀起了一股跨界风&#xff0c;“跨界增值宣传”似乎成为了品牌年轻化的必经之路&#xff0c;众多品牌通过跨界的方式实现互相补足、用户渗透&#xff0c;…

#Chrome扩展程序开发教程--01:基本概念介绍

#Chrome扩展程序开发教程--01&#xff1a;基本概念介绍 引言1、什么是扩展程序&#xff1f;2、Web技术3、Chrome 扩展程序API4、扩展程序架构 引言 本系列博客旨在带来最新的Chrome扩展程序开发入门教程。 1、什么是扩展程序&#xff1f; 通过向Chrome浏览器添加自定义特性和功…

Docker容器---网络、容器操作

Docker容器---网络、容器操作 一、docker实现原理二、docker网路模式1、Host模式2、container模式3、none模式4、bridge模式 三、自定义网络1、查看网络模式列表2、查看容器信息3、指定分配IP地址4、自定义网络固定IP 四、暴露端口五、容器端口映射1、创建端口映射 六、资源控制…

wordpress建站/demo

bidewang.co/ele 建站的另一种途径Sign in – My Account tanrenchang.atspace.cc 登录 ‹ Fashion trading platform — WordPress cPanel 是一个用于管理网站的虚拟主机控制面板。 使用 cPanel&#xff0c;可以轻松管理电子邮件帐户、数据库、FTP 用户以及与托管、设置和管…

windows10下使用minGW64 编译krita源码报错

系列文章目录 文章目录 系列文章目录前言一、错误原因二、使用步骤1.引入库 前言 collect2.exe: error: ld returned 1 exit status mingw32-make[2]: *** [plugins\color\lcms2engine\CMakeFiles\kritalcmsengine.dir\build.make:614: bin/kritalcmsengine.dll] Error 1 ming…

websever|2.19-2.27|信号概述-SIGCHILD信号

2.19信号概述 信号也是进程间通信的一种方式 其中1-31是操作系统定义的标准信号&#xff0c;比较重要。需要掌握其中几个。 34-64是预定义好的信号&#xff0c;是实时的信号 core文件中保存异常终止的一些信息。 在2.20节的开头&#xff0c;老师重点讲解了 的core文件。 进程出…

57 openEuler搭建Mariadb数据库服务器-管理数据库用户

文章目录 57 openEuler搭建Mariadb数据库服务器-管理数据库用户57.1 创建用户57.2 查看用户57.3 修改用户57.3.1 修改用户名57.3.2 修改用户示例57.3.3 修改用户密码57.3.4 修改用户密码示例 57.4 删除用户57.5 用户授权57.6 删除用户权限 57 openEuler搭建Mariadb数据库服务器…

集群聊天服务器项目(四)——项目总结

集群聊天服务器项目总结 首先是就是项目介绍集群聊天服务器项目(零)——项目介绍中的内容&#xff0c;就不再次copy过来了 项目简单介绍 技术栈 环境和库依赖 按模块介绍整个项目 程序的主要模块是网络模块、业务模块、数据模块、Json、redis发布订阅消息队列模块以及ngi…

Anaconda环境闭着眼睛安装tensorflow2.0-GPU

1.创建conda环境 conda create -n tf2 python3.7 2.进入conda环境 conda activate tf2 3.输入 nvidia-smi 查看有没有显卡驱动。(没有安一个&#xff0c;不管是windows/linux) 4. 安装cudatoolkit 和 cuDNN conda install cudatoolkit10.0 cudnn 5. 安装tensorflow pip ins…