【VerilogHDL】模块

2023-10-27

模块基本语法

Module<模块名>(<端口列表>)
	端口说明
	参数定义
	数据类型定义
	连续赋值语句(assign)
	过程块(initial和always)
		-行为描述语句
	底层模块实例
	任务和函数
	延时说明块
endmodule

2选1多路选择器实例

在这里插入图片描述

module mux2_1(out,a,b,sel);		//端口定义
	output out;					//输入输出列表
	input a,b,sel;
	
	not i5(sel_n,sel);			//结构描述
	and i6(sel_a,a,sel);
	and i7(sel_b,sel_n,b);
	or i8(out,sel_a,sel_b);
endmodule

下面逐行解释上例代码:

module mux2_1(out,a,b,sel);		//端口定义

声明模块名及其端口列表。

output out;

指定端口out的方向为输出(output),output是用于声明端口方向的一个Verilog关键字。

input a,b,sel;

指定端口a,b,sel的方向为输入(input)。

not i5(sel_n,sel);			//结构描述

生成一个Verilog内建基本门级元件not(非门)的实例(也叫做模块的调用,类似于C语言中的函数调用),该实例名为i5。第一个端口sel_n是输出端口,信号sel连接到该not元件的输入端口。

and i6(sel_a,a,sel);
and i7(sel_b,sel_n,b);

生成Verilog内建基本门级元件and(与门)的两个实例,实例名分别是i6和i7。

or i8(out,sel_a,sel_b);

生成Verilog内建基本门级元件or(或门)的实例i8。

endmodule

用关键字endmodule示意模块结束。

模块描述方式

模块的描述方式又称为建模方式。大致可以按以下四类抽象级别来进行描述。

行为级或算法级的描述方式(行为级建模)

这是VerilogHDL最高抽象级别的描述方式。行为描述是通过行为语句来实现的,行为功能可使用下述过程语句结构描述。

  • initial语句:此语句只执行一次。
  • always语句:此语句循环执行。

只有寄存器类型数据能够在这两种语句中被赋值。寄存器型数据在被赋新值之前保持原有值不变。所有的 initial 语句和 always 语句在零时刻并发执行。

4bit 的二进制行波计数器(带进位)

在这里插入图片描述

module cnt_4bit(q, clear, clock);
	output [3:0] q;
	input clear, clock;

	reg [3:0] q;
	always @(posedge clear or negedge clock)
	begin
		if (clear)
			q = 4'd0;
		else
			q = (q + 1) % 16;
	end
endmodule

模块 cnt_4bit 的输出端口 q 是一个 4bit 的位矢量,代表 4 根输出端口线 q[3],q[2],q[1],q[0]。由于该输出端口要在always语句中被赋值,所以它被定义为 reg 型(寄存器型)数据。
clear,输入端口,清零端。
clock,输入端口,时钟信号。
always语句中包含一个或事件控制,以及相关联的顺序过程(begin-end对)。此或事件控制的作用是当输入端口clear、clock上发生事件,即clear上升沿(posedge)到来或clock下降沿(negedge)到来时,就执行下面的顺序过程。
顺序语句执行完后被挂起,always语句再次等待clear、clock的值发生变化。

数据流描述方式(数据流级建模)

也称为RTL(寄存器传输级)描述方式。在这种描述方式下,设计者需要知道数据是如何在寄存器之间传输的以及将被如何处理。
在Verilog中数据流描述方式主要用来描述组合逻辑,具体由连续赋值语句“assign”来实现。下面仍以 4bit 二进制行波计数器为例,根据自顶向下(Top-Down)的设计方法,用数据流描述的方式来实现它。

第一步,设计顶层模块 cnt_4bit_1 ,代码包含了4个T触发器模块T_ff实例(模块调用)。

module cnt_4bit_1 (q, clear, clock);
	output [3:0] q;
	input clear,clock;

	T_ff tff0(q[0], clear, clock);
	T_ff tff1(q[1], clear, q[0]);
	T_ff tff2(q[2], clear, q[1]);
	T_ff tff3(q[3], clear, q[2]);
endmodule

第二步,设计T_ff触发器模块,该模块内又包含了其下一层的D触发器模块 edge_dff 实例。

module T_ff(q, clear, clock);
	output q;
	input clear, clock;

	edge_dff ff1(q, , ~q, clear, clock);
endmodule

数据流操作符"~"代表对信号q取反,与Verilog内建基本门级元件not实现功能相同。

edge_dff ff1(q, , ~q, clear, clock);

其中的空格表示默认调用。
第三步,运用数据流描述语句设计最底层模块负边沿触发D触发器 edge_dff。
在这里插入图片描述

module edge_dff(q, qbar, d, clear, clock);
	output q, qbar;
	input d, clear, clock;

	wire s, sbar, r, rbar, cbar;
//输入锁存器:锁存器是电平敏感的。而一个边沿敏感的触发器需要使用3个RS锁存器来实现
assign sbar = ~(rbar & s),
		s = ~(sbar & cbar & ~clock),
		r = ~(rbar & ~clock & s),
		rbar = ~(r & cbar & d);
//输出锁存
assign cbar = ~clear,
		qbar = ~(q & r & cbar);
endmodule

s、sbar、r、rbar、cbar被定义为 wire(连线)型数据,wire也是Verilog的关键字。可以理解为它们都是指导线。
在其后的代码中使用assign语句对模块的输入、输出端口和连线型数据之间的数据流传输关系进行了描述。

assign cbar = ~clear,

例如此行,可以理解为 cbar 导线上的电平为 clear 上的电平取反。体现到物理电路上,就如下图。
在这里插入图片描述

门级描述方式(门级建模)

在这种描述方式下,模块是按照逻辑门和它们之间的互连来体现的。具体来说,门级描述方式就是指调用Verilog内建的基本门级元件来对硬件电路进行结构设计。
仍以行波计数器为例,其第三步的模块edge_dff的设计可以采用门级描述的方式来实现。

module edge_dff_1 (q, qbar, d, clear, clock);
	output q, qbar;
	input d, clear, clock;
	wire cbar, clkbar, sbar, s, r, rbar;

	not N1(cbar, clear),
		N2(clkbar,clock);
	nand NA1(sbar, rbar, s),
		NA2(s, sbar, cbar, clkbar),
		NA3(r, s, clbar, rbar),
		NA4(rbar, r, cbar, d),
		NA5(q, s, qbar),
		NA6(qbar, q, cbar, r);
endmodule

内置门级元件有14种,分4类:

  • 多输入门:and(与)、nand(与非)、or(或)、nor(或非)、xor(异或)、xnor(同或)
  • 多输出门:buf(缓冲器)、not(非门)
  • 三态门:bufif0(低电平使能缓冲器)、bufif1(高电平使能缓冲器)、notif0(低电平使能非门)、notif1(高电平使能非门)
  • 上拉、下拉电阻:pullup、pulldown

具体定义即调用会在单独的文章中写到。

开关级描述方式(开关级建模)

也称为晶体管级描述方式,是Verilog最低抽象级别的描述方式。是调用Verilog内建的基本开关级元件来对硬件电路进行结构设计。
由于有了这一级别的描述方式,使得用户在MOS(Metal-Oxide Semiconductor,金属氧化物半导体)晶体管级别进行设计成为可能。
可以使用CMOS(互补金属氧化物半导体)设计nor门(或非门)。
在这里插入图片描述

module my_nor(out, a, b);
	output out;
	input a, b;
	wire c;

	supply1 pwr;
	supply0 gnd;
	pmos(c, pwr, b);
	pmos(out, c, a);
	nmos(out, gnd, a);
	nmos(out, gnd, b);
endmodule

程序中的supply1、supply0是Verilog的关键字,分别定义电路的电源和地。pmos、nmos都是Verilog的基本开关级元件。

描述方式总结

可以在同一个设计中混合使用这四种描述方式。从设计的成熟性上考虑,大多数模块都可以化为门级描述来实现。
通常来说,描述方式越抽象,设计的灵活性和技术独立性也越强,而越靠近开关级的描述方式,对技术的依赖性也越强,设计本身也就越不灵活,一个小改动就可能导致整个设计的大改变。

抽象程度:
行为级>数据流级>门级>开关级

灵活性:
行为级>数据流级>门级>开关级

设计的仿真与测试

一个设计一旦完成就应该对它进行测试。通过编写激励块,输入激励信号然后检测结果可以检测一个设计功能的正确性。

将激励块和设计块分开来是设计者应该养成的一个好习惯。

通常测试块也被称为测试凳(Test Bench),应用不同的测试凳可以对一个设计块进行全方位的测试。

激励信号的应用方式大致被分为两种:
,在激励块内调用设计块,并且直接驱动设计块的信号。
在这里插入图片描述
,在顶层的假模块内同时调用激励块和设计块,激励块和设计块仅通过接口相互作用。顶层模块的作用仅仅是为了调用设计块和激励块。
在这里插入图片描述
将行波计数器设计模块进行改写:

module cnt_4bit(q, clear, clock);
	output [3:0] q;
	input clear, clock;

	reg [3:0] q;
	
	always @(posedge clear or negedge clock)
	begin
		if (clear)
			q = 4'd0;
		else
			q = (q + 1) % 16;
	end
endmodule

编写激励块

module stimulus1;
reg clk;
reg reset;
wire [3:0] q;
cnt_4bit r1(q, reset, clk);		//调用设计块cnt_4bit生成实例r1
//控制信号clk以驱动设计块,时钟周期设为10个时间单位
initial
	clk = 1'b0;			//设置clk到0
always
	#5 clk = ~clk		//clk每隔5个时间单位反转一次
//控制复位信号reset以驱动设计块,0~15为高,15~195为低,195~205为高,然后变低
initial
begin
	reset = 1'b1;
	#15 reset = 1'b0;
	#180 reset = 1'b1;
	#10 reset = 1'b0;
	#20 $finish;
end
//监视输出
initial
	$monitor($time,"output q = %d", q);
endmodule

接下来就可以运行仿真器,以检测设计块功能的正确性。

模块的调用

指从模块模板生成实际的电路结构对象,这样的电路结构对象被称为模块实例,模块调用也被称为实例化。

每一个实例都有它自己的名字、变量、参数和I/O接口。

被复制的电路块将一直存在,因为硬件电路结构不会随着时间而发生变化。

Verilog中,模块不能被嵌套定义,但可以包含其他模块的拷贝,即实例。

模块调用语句的基本格式:
<模块名><参数值列表><实例名> (<端口连接表>);

参考文献:
1.《精通Verilog HDL语言编程》,刘 波 编著,电子工业出版社,2007年5月第一次印刷。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【VerilogHDL】模块 的相关文章

  • 打印存储在 reg 类型变量中的有符号整数值

    如何打印存储在 8 位寄存器中的有符号整数值 声明为 reg 7 0 acc Using display acc d acc 它打印无符号值 正确的语法是什么 display功能 如果您声明reg as signed display将显示减
  • Verilog 位更改位置

    假设我有一个寄存器reg 15 0 my reg 其中包含一个16位signed sample 如何找到第一位变化的位置 意思是 如果假设my reg 16 b0001011011010111 我怎么知道第一个变化是0 to 1 is at
  • |变量在verilog中是什么意思?

    我想知道什么assign hd trs detected hd trs match Verilog 中的意思 我最感兴趣的是 hd trs match部分 我知道 表示按位或 但不确定如何解释它之前没有值 它是可理解的 1 还是 0 如果它
  • 如何在 Verilog 中定义带参数的模块?

    我想定义一个add有一个参数的模块 但我对新实例的声明进展不顺利 我想定义这个模块的一个实例 module add parameter wd 1 input wire wd 1 0 a b output wire wd 1 0 o assi
  • 使用数据流模型的T触发器

    我正在尝试模拟 t flipflop 的工作 timescale 1ns 1ps module t flipflop input t input clk input clear output q output qbar wire sbar
  • 「Verilog学习笔记」游戏机计费程序

    专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点 刷题网站用的是牛客网 timescale 1ns 1ns module game count input rst n 异位复位信号 低电平有效 input clk 时
  • Verilog 中总是后面跟着 #(...) pound 是什么意思?

    在一个简单的时钟生成器示例中 我看到以下代码 always cycle 2 clk clk 我以前总是见过 但没见过井号 我试图在文档中找到它 但我所能找到的只是一些对 实值端口 的引用 没有进一步的阐述 这是一个延迟操作 它本质上只是读取
  • 如何在verilog中逐行读取文本文件?

    我有一个 SREC 文件 它是一个简单的文本文件 我想在 verilog 中逐行读取它 我怎样才能做到这一点 以下读取文件 每个时钟周期 1 行 预期的数据格式是每行一个十进制数 integer data file file handler
  • Verilog 最佳实践 - 递增变量

    我绝不是 Verilog 专家 我想知道是否有人知道这些增加值的方法中哪一种更好 抱歉 如果这个问题太简单了 Way A 在组合逻辑块中 可能在状态机中 some condition count next count 1 然后在一个连续块中
  • 30天精通Nodejs--第二十一天:express-依赖注入

    目录 引言 Express中的模块化实践 依赖注入 什么是依赖注入 Express中实现依赖注入 结语 引言 在构建大型且复杂的Node js Express应用程序时 良好的架构设计至关重要 模块化编程可以帮助我们把代码分解为可复用 易维
  • 从测试台访问 uvm_config_db 的最佳方式?

    我想在我的顶级测试平台中创建一个时钟 其周期可以通过测试进行控制 我所做的是将周期设置到 uvm config db 中并将其返回到测试台中 我必须输入 1 以确保构建阶段已完成 否则 get 返回错误值 module testbench
  • 在verilog中将wire值转换为整数

    我想将电线中的数据转换为整数 例如 wire 2 0 w 3 b101 我想要一个将其转换为 5 并将其存储在整数中的方法 我怎样才能以比这更好的方式做到这一点 j 1 for i 0 i lt 2 i i 1 begin a a w i
  • if 语句导致 Verilog 中的锁存推断?

    我正在编写用于合成算法的 Verilog 代码 我对哪些情况可能导致推断锁存器有点困惑 下面是这样的一段代码 虽然它在模拟中工作得很好 但我担心它可能会导致硬件问题 always b1 or b2 b1 map b2 map m1 map
  • 如何使用 Verilog 和 FPGA 计算一系列组合电路的传播延迟?

    我是 FPGA 和 HDL 的新手 但我正在尝试学习 但无法弄清楚这一点 如何通过多个级别的组合逻辑来计算或估计传播延迟 我可以仅凭经验确定这一点 还是可以在设计时弄清楚 在这种情况下 我使用 FPGA 来实现奇偶校验设置和检查电路 该电路
  • 如何在 Verilog 中综合 While 循环?

    我尝试设计一个 Booth 乘法器 它在所有编译器中运行良好 包括 Modelsim Verilogger Extreme Aldec Active Hdl 和 Xilinx Isim 我知道模拟和综合是两个不同的过程 而且只有少数Veri
  • 如何使用 don't cares 参数化 case 语句?

    我有一条称为输入的电线 我想检测前导的数量 我正在尝试创建一个模块 该模块使用下面的 case 语句根据前导零的数量更改输出数据 然而 输入的大小是可参数化的 如果 X 是固定值 4 我将创建一个 case 语句 case input 4
  • 我们可以在 C 或 SystemVerilog 中使用 ifdef MACROS 中的条件吗?

    我想要那样的东西 ifdef N O gt N I define GREATER 1 else define LESSER 1 endif 但做不到 有什么解决方案或阅读吗 我很努力地想要做到这一点 但是却做不到 Verilog 不提供这样
  • 在 Verilog 设计中产生时钟故障

    我正在使用 Verilog 设计芯片 我有一个 3 位计数器 我希望当计数器处于第 8 次循环时 应该有一个时钟故障 之后就可以正常工作了 在 Verilog 设计中产生时钟故障的可能方法是什么 在时钟信号上注入毛刺的一种方法是使用forc
  • 如何在 Verilog 中推断 Block RAM

    我在一个项目中遇到了一个非常具体的问题 这个问题已经困扰我好几天了 我有以下 RAM 模块的 Verilog 代码 module RAM param clk addr read write clear data in data out pa
  • Verilog 按位或 ("|") 单子

    我见过 Verilog 代码 其中使用了按位或运算符 目的是什么 例如 address 15 14 0 or address 15 14 io din ramrd 不能省略 吗在这些情况下 在这种情况下 它充当归约运算符 例如 4 b100

随机推荐

  • IHS 禁用SSLV2 启用SSLV3

    昨天完成了PCI第二季度的ASV扫描 也扫出几个问题 主是IHS SSL加密比较弱 1 PCI ASV扫描出来的两个问题 1 38140 SSL Server Supports Weak Encryption Vulnerability 2
  • FastReport VCL 6.7.6 For Delphi10.4.2 安装图解教程

    FastReport VCL 6 7 6 For Delphi10 4 2 安装图解教程 Fastreport控件的安装 一步一步按说明来 不难搞 1 先关闭Delphi 2 右键 以管理员身份运行 对应版本的recompile exe 2
  • 图片情感分析(2):图像情感分析模型

    图像情感分析模型是基于卷积神经网络建立的 卷积神经网络的构建用了keras库 具体代码实现以及代码运行在下一篇贴出 模型包括3个卷积层 2个池化层 4个激活函数层 2个Dropout层 2个全连接层 1个Flatten层和最终分类层 图片初
  • Java创建数组的四种方式

    1 使用默认值来初始化 语法 数组元素类型 数组名称 new 数组元素类型 数组长度 EG int nums new int 5 创建了一个类型为int 名字为nums 长度为5的数组 2 先声明一个数组 再给值 语法 数据元素类型 数组名
  • 37 年来首次 FSF 允许非正式会员提名董事会候选人;Linux RamFS 文件系统移植到 Rust;Git 2.35 发布

    整理 宋彤彤 责编 屠敏 开源吞噬世界的趋势下 借助开源软件 基于开源协议 任何人都可以得到项目的源代码 加以学习 修改 甚至是重新分发 关注 开源日报 一文速览国内外今日的开源大事件吧 一分钟速览新闻点 成立 37 年来首次 FSF 允许
  • Spring boot配置logback日志打印到指定路径文件

    在实际项目开发中 一般都是使用log打印日志到指定路径 生成文件 而平时使用的System out pring 只能输出日志到控制台 当我们把项目打成war包部署到服务器上 会有不用的用户使用我们的应用 这个时候如果一个客户端出现了问题 那
  • 断弧图片数据集 数据集扩充 增强

    图像处理可以用到的数据 这是原始图像总共1356张 对应的XML文件是它的标签 此数据可以用来做图像目标检测 YOLOv4 v3 SSD faster rcnn 数据集增广 数据集扩充 数据集增强的常用方法与软件 https blog cs
  • 修改pycharm缓存文件路径

    Pycharm在使用过程中 Pycharm会生成大量缓存文件 而这些缓存文件默认存储在C盘的用户目录里面 导致C盘空间被占用 目标 将C盘用户目录下的 Pycharm2019转移到D盘 D cache pycharm 文件夹下 如下图 解决
  • div设置边角小三角形

    div class leftmsg div div class rightmsg div
  • 使用NCNN的INT8量化方式进行推理

    本文以NCNN框架为例 实践量化在推理中的巨大作用 加深对神经网络量化的理解 NCNN当前版本只支对称量化 下面以INT8精度为例介绍NCNN的量化使用方式 编译NCNN mkdir build cd build cmake 进入到buil
  • Java面试--常见集合

    Java面试 基础 ArrayList ArrayList的扩容机制 FailFast和FailSafe ArrayList和LinkedList HashMap 介绍一下put方法流程 1 7和1 8有何不同 负载因子默认值为何是0 75
  • CSDN编程竞赛 ——— 第六期之python

    CSDN编程竞赛报名地址 https edu csdn net contest detail 16 请不要删掉此地址 目录 前言 背景 大赛简介 参赛流程 参赛经历 解题思路 经验心得 资料分享 前言 背景 目前为止共参加过三次 不过没拿到
  • 20201013 矩阵2范数matlab求解

    这里是引用n norm X 返回矩阵 X 的 2 范数或最大奇异值 该值近似于 max svd X 示例 n norm X p 返回矩阵 X 的 p 范数 其中 p 为 1 2 或 Inf https ww2 mathworks cn he
  • java导出Excel增加下拉框选项,解决小数据量和大数据量下拉框选项的问题

    文章目录 java导出Excel增加下拉框选项 一 小数据量情况 二 大数据量情况 java导出Excel增加下拉框选项 java结合easyExcel 添加传参模型ConsumablesAddDTO 一 小数据量情况 仅供参考 二 大数据
  • 鸿蒙系统怎么退出,华为鸿蒙2.0系统升级了怎么退回EMUI11系统?操作教程详解[多图]...

    华为鸿蒙2 0系统升级了怎么退回EMUI11系统 很多用户升级了又不知道如何才能退回到原来的系统 下面就让安卓乐园小编为大家带来 2 0系统升级退回EMUI11系统操作教程详解 这次开启华为鸿蒙2 0系统手机开发者beta版公测招募的机型有
  • 遗传算法最通俗的讲解案例

    遗传算法 遗传算法求全局最优解或者近似优解 遗传算法GA可以用到数据挖掘领域 由于缺少一些详细的例子 导致难以理解 以下是一个大牛的遗传算法的详细例子 通过这个例子 我们可以详细而且直观的加深对遗传算法的理解 遗传算法的有趣应用很多 诸如寻
  • 机器学习 之 python实现 多元线性回归 梯度下降 普适算法与矩阵算法

    介于网上的多元线性回归梯度下降算法多为固定数量的因变量 如三元一次函数 y 1 x 1
  • 有向图问题1--深度优先、广度优先遍历和拓扑排序

    有向图基础 术语定义 一个顶点的出度为由该顶点指出的边的总数 一个顶点的入度为指向该顶点的边的总数 一条有向边的第一个顶点称为它的头 第二个顶点称为它的尾 数据结构 使用邻接表来表示有向图 其中v gt w表示为顶点v对应的邻接链表中包含一
  • 纯CSS实现背景色渐变

    这里简单介绍一下如何用纯CSS实现背景渐变色 一 关键词 1 linear gradient 首先我们要使用的就是CSS中的linear gradient 函数 它用于创建一个表示两种或多种颜色线性渐变的图片 其结果属于数据类型 是一种特别
  • 【VerilogHDL】模块

    VerilogHDL 模块 模块基本语法 2选1多路选择器实例 模块描述方式 行为级或算法级的描述方式 行为级建模 4bit 的二进制行波计数器 带进位 数据流描述方式 数据流级建模 门级描述方式 门级建模 开关级描述方式 开关级建模 描述