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

这篇具有很好参考价值的文章主要介绍了【Verilog HDL】FPGA-Verilog文件的基本结构。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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


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

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

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

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};

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

🧸结尾文章来源地址https://www.toymoban.com/news/detail-439972.html


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

到了这里,关于【Verilog HDL】FPGA-Verilog文件的基本结构的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【FPGA】组合逻辑电路三种建模方式(Verilog HDL 门级建模、Verilog HDL 数据流建模、组合电路行为级建模)

    目录   Verilog HDL 门级建模 各种逻辑门的表示和使用 门级建模书写实例 Verilog HDL 数据流建模 数据流建模 数据流建模书写实例 组合电路行为级建模 always语句 条件语句 多路分支语句 循环语句 for while repeat forever 行为级建模示例   可以理解为对逻辑电路中各个门依次进行描述

    2024年04月13日
    浏览(49)
  • FPGA实验报告 Verilog HDL:7人表决器 巴克码信号发生器 FPGA数字时钟

    写在前面:本文提供以下三个任务的思路讲解和代码实现, 如需参考引脚配置说明,可以点击下方链接跳转查看完整实验报告 ;本实验使用的是Altera公司的cycloneⅢ类型的芯片。 Verilog HDL实现:7人表决器 信号发生器 多功能数字时钟 实验目标:实现7人投票表决电路,支持人

    2024年02月05日
    浏览(49)
  • FPGA在校学习记录系列---实验4不同状态的LED+开发板(Verilog HDL)

    此系列记录FPGA在学校的学习过程。 FPGA系列 需要用到的软硬件: 软件:Quartus II 15.0 (64-bit) 硬件: 5CEBA4F23C7芯片 链接: FPGA在校学习记录系列—新建一个FPGA工程编写程序并仿真(Verilog HDL) 创建的工程名字为:LED (这次不用仿真,直接用开发板验证) 编译文件 按键资源:

    2024年04月09日
    浏览(49)
  • FPGA/Verilog HDL/AC620零基础入门学习——第一个项目按键控制LED

    最近要考试了,所以我赶紧补习FPGA,我们用的是小梅哥的AC620开发板,软件是Quartus。推荐看这个视频教程:零基础轻松学习FPGA,小梅哥FPGA设计思想与验证方法视频教程 用按键控制LED灯的亮灭就是一个二选一多路器,两个IO,a、b,可以是高电平,也可以是低电平。 输入按键

    2024年02月05日
    浏览(57)
  • 基于FPGA的DDS原理信号发生器设计 quartusII 9.1平台 Verilog HDL语言编程 可产生正弦波

    基于FPGA的DDS原理信号发生器设计 quartusII 9.1平台 Verilog HDL语言编程  可产生正弦波、方波、锯齿波以及三角波   频率幅度可调节   代码+原理图 在现代电子技术领域,针对各种应用的信号发生器是一种非常核心的设备,而基于现场可编程逻辑门阵列(FPGA)的直接数字合成(

    2024年04月27日
    浏览(63)
  • FPGA实现的多波形信号发生器,支持正弦、方波、锯齿波、三角波及调制,配备仿真和实物制作功能,使用Verilog HDL编写

    基于FPGA的DDS多波形信号发生器,可以产生正弦波,方波,锯齿波三角波,调制波形2psk.2askAM调制,可以仿真,可以制作实物,可以进行讲解! 使用可以使用Quarter9.0自带仿真软件进行仿真波形。 也可以使用quarter13.1与modesim进行联合仿真进行仿真波形! 使用verilog HDL语言进行编

    2024年04月12日
    浏览(54)
  • FPGA实践 ——Verilog基本实验步骤演示

    0x00 回顾:AND/OR/NOT 逻辑的特性 AND: 与门可以具有两个或更多的输入,并返回一个输出。当所有输入值都为 1 时,输出值为 1。如果输入值中有任何一个为 0,则输出值为 0。 OR: 或门可以具有两个或更多的输入,并返回一个输出。如果输入值中至少有一个为 1,则输出值为

    2024年02月13日
    浏览(35)
  • 【FPGA入门】第一篇、Verilog基本语法常识

    目录 第一部分、不同的变量类型 1、wire和reg的区别  2、如何对变量进行赋值呢? 3、什么是阻塞?什么是非阻塞? 第二部分、变量位宽的定义 1、各种系统默认情况 2、变量位宽声明方式 3、表明位宽的情况下,赋值方式 4、两个模块之间例化,不定义变量直接用的方式 5、常

    2024年02月04日
    浏览(52)
  • 【FPGA基础入门实践】Verilog 基本项目操作逐步演示

    0x00 回顾:AND/OR/NOT 逻辑的特性 AND: 与门可以具有两个或更多的输入,并返回一个输出。当所有输入值都为 1 时,输出值为 1。如果输入值中有任何一个为 0,则输出值为 0。 OR: 或门可以具有两个或更多的输入,并返回一个输出。如果输入值中至少有一个为 1,则输出值为

    2024年02月12日
    浏览(38)
  • Verilog HDL笔记

    1. 逻辑值         0:逻辑低电平,条件为假         1:逻辑高电平,条件为真         z:高阻态,无驱动         x:未知逻辑电平 2. 归约运算符,按位运算符         以为例,当作为一元运算符时表示归约与,m是将m中所有比特位相与,最后的结果为1bit         例如

    2024年02月03日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包