Verilog基础语法(4)之模块和端口及其例化和处理

这篇具有很好参考价值的文章主要介绍了Verilog基础语法(4)之模块和端口及其例化和处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、模块与端口

1、模块

Verilog进行FPGA/IC设计值,通常划分为各个子模块,木模块之间可能相互例化,并在顶层统一例化,并连接成一个顶层模块文件。
基本的模块模板:

module module_name(
	input i_clk,
	input i_a,
	input [3:0] i_b,
	input i_en,
	output o_out,	
	inout [3:0] o_c
	//your input/ouput/inout ports
);

//your sequential logic
always@(posedge i_clk) begin
//your sequential logic
end

//your combinational logic
always@(*) begin
//your logic
end

assign o_c = i_en ? i_b : 4'hz;
//......

//institation other module
a_module inst(
.i_clk(i_clk),
.i_a(i_a),
.o_c(o_c),
);

endmodule

如果模块内的变量位宽参数化,则模块模板为:

module exam_module 
#(
parameter c_WIDTH = 8,
parameter c_DEPTH = 16 
)(
//input 
input i_a,
//inout
inout io_b,
//output 
output o_c
);

//the same as before module
endmodule

例化带参数的模块:

module top_module(
// input/output/inout ports define
);

//other logics

//institation module with parameter
exam_module 
#(
.c_WIDTH(8),
.c_DEPTH(6)
)inst0(
//ports parts
);

endmodule

2、端口

端口类型/端口描述

  • input 设计模块只能使用其input端口从外部接收值
  • output 设计模块只能使用其output端口将值发送到外部
  • inout设计模块可以使用其inout端口发送或接收值
module  my_design ( input wire      clk,
                    input           en,
                    input           rw,
                    inout [15:0]    data,
                    output           int );
 
  // Design behavior as Verilog code 
endmodule

关于模块端口的说明
当不定义端口数据类型时,默认为wire型,端口名不能重复,需要存储值的输出端口应该声明为 reg 数据类型,并且可以在程序块中使用,比如 always 和 initial only。

输入或inout类型的端口不能声明为reg,因为它们是由外部连续驱动的,不应该存储值,而是尽快反映外部信号的变化。连接两个不同向量大小的端口是完全合法的,但以向量大小较小的端口为准,而另一个宽度较大的端口的剩余位将被忽略。

有符号端口声明

可以使用signed属性来声明有符号端口,默认情况下是无符号的端口。

 module ( 
           input signed a, b,  // a, b are signed from port declaration
           output reg signed c // c is signed from reg declaration
           );
  
  endmodule

2001年verilog修订:模块端口声明:

module test ( input [7:0]  a,
                            b,     // "b" is considered an 8-bit input
              output [7:0]  c);
 
  // Design content        
endmodule
 
module test ( input wire [7:0]  a,   
              input wire [7:0]  b,     
              output reg [7:0]  c);
 
  // Design content
endmodule
  • 如果端口声明包含网络或变量类型,则认为该端口已完全声明。在网络或变量类型声明中重新声明相同的端口是非法的。
module test ( input      [7:0] a,       // a, e are implicitly declared of type wire
            output reg [7:0] e );
 
   wire signed [7:0] a;     // illegal - declaration of a is already complete -> simulator dependent
   wire        [7:0] e;     // illegal - declaration of e is already complete
 
   // Rest of the design code
endmodule
  • 如果端口声明不包含网络或变量类型,则可以再次在网络或变量类型声明中声明端口
module test ( input      [7:0] a,
              output     [7:0] e);
 
     reg [7:0] e;              // Okay - net_type was not declared before
 
     // Rest of the design code
endmodule

二、模块例化与端口处理

Verilog例化方式分为两种,一种是按端口定义时的顺序例化,一种是按端口名来例化。
举例说明:
首先给出一个模块端口:

module mydesign ( input  x, y, z,     // x is at position 1, y at 2, x at 3 and
                  output o);          // o is at position 4
 
endmodule
  1. 按端口排序顺序例化

  module tb_top;
    wire [1:0]  a;
    wire        b, c;
 
    mydesign d0  (a[0], b, a[1], c);  // a[0] 连接 x
                                      // b 连接 y
                                      // a[1] 连接 z
                                      // c 连接  o
  endmodule
  1. 按端口名例化
  module tb_top;
    wire [1:0]  a;
    wire        b, c;
	mydesign d0(
	.x(a[0]),
	.y(b),
	.z(a[1]),
	.o(c)
	); 
  endmodule

未连接/悬空端口处理
未连接到例化模块中的端口按高阻态处理。如下:

module design_top(
	input [1:0] a,
	output c
);
  mydesign d0   (              // x 没有写, a[0] = Z 以高阻态显示
                .y (a[1]),
                .z (a[1]),
                .o ());        // o 虽然写了,但是没有连接任何端口信号,
                               // it is not connected to "c" in design_top, c will be Z
endmodule

端口x,就连写都没写,因此,可以认为是一个未连接的悬空端口,是一个高阻态;
端口o,虽然写了,但是也没连接到顶层模块中的任意一个端口上,因此顶层的端口c也是一个高阻态。
例如:
触发器:

// Module called "dff" has 3 inputs and 1 output port
module dff (   input       d,
              input       clk,
              input       rstn,
              output reg  q);
 
  // Contents of the module  
  always @ (posedge clk) begin
    if (!rstn)
      q <= 0;
    else 
      q <= d;
  end
endmodule

当所有端口都有效连接时:

module shift_reg (   input   d,
                    input    clk,
                    input   rstn,
                    output   q);
 
  wire [2:0] q_net;
  dff u0 (.d(d),        .clk(clk), .rstn(rstn), .q(q_net[0]));
  dff u1 (.d(q_net[0]), .clk(clk), .rstn(rstn), .q(q_net[1]));
  dff u2 (.d(q_net[1]), .clk(clk), .rstn(rstn), .q(q_net[2]));
  dff u3 (.d(q_net[2]), .clk(clk), .rstn(rstn), .q(q));
 
endmodule

RTL原理图:
verilog 模板,# Verilog基础语法,fpga开发
当有些端口未连接时:

module shift_reg (   input   d,
                    input    clk,
                    input   rstn,
                    output   q);
 
  wire [2:0] q_net;
 
  dff u0 (.d(d),        .clk(clk), .rstn(rstn), .q(q_net[0]));
  dff u1 (.d(q_net[0]), .clk(clk), .rstn(rstn), .q());             // Output q is left floating
  dff u2 (.d(q_net[1]), .clk(clk), .rstn(rstn), .q());             // Output q is left floating
  dff u3 (.d(q_net[2]), .clk(clk), .rstn(rstn), .q(q));
 
endmodule

RTL原图:
verilog 模板,# Verilog基础语法,fpga开发
对其进行仿真,由于短口味连接即悬空了,输出为高阻态z

verilog 模板,# Verilog基础语法,fpga开发文章来源地址https://www.toymoban.com/news/detail-643913.html

到了这里,关于Verilog基础语法(4)之模块和端口及其例化和处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • VSCODE-Verilog开发插件/(代码格式化+Verilog文件树显示+一键例化+UCF转XDC+代码错误检查+语法高亮)

    VSCODE插件,可实现功能: 变量对齐 逗号对齐 括号对齐 快捷键:CTRL + L 例化的代码自动复制到剪切板 快捷键:ctrl+shift+p :输入 Convert_instance 正常顺序转换 可实现序号的从小到大的排列 快捷键:ctrl+shift+p :输入 Convert UCF to XDC NORMAL ORDER 或 Convert UCF to XDC SORT ORDER ucf, xdc, do, tcl 语法

    2024年03月10日
    浏览(50)
  • vivado中如何生成、例化和仿真DCP文件

    1、在vivado-Tool-setting-project-setting-synthesis路径下,设置 -mode out_of_context(综合时不产生IO buffer) 2、将引脚约束注释掉,防止例化使用DCP文件时报错 3、将工程综合,打开综合设计。 4、在console输入命令,生成DCP文件: write_checkpoint -key C:/Users/YDQ/Desktop/key_files.txt -encrypt top.dcp 其

    2024年02月05日
    浏览(45)
  • 【FPGA】verilog基础语法与应用:位操作 / 模块调用——流水灯(跑马灯)

    今天的实验是计数器实验的升级,设计让8个LED灯以每个0.5s的速率循环闪烁 1 移位法实现 1.1 移位方法1 每个LED灯代表一位,共8位,亮为1,灭为0 如何实现这样的逻辑呢? 移位操作即可! 怎么样才能移位呢? 第一个状态需满足最低位为1,然后每次左移1个 源代码 仿真代码 功

    2024年01月16日
    浏览(49)
  • 【FPGA】Verilog设计入门——时序模块及其Verilog表述

    目录 1.边沿触发型触发器及其Verilog表述 2.电平触发型锁存器及其Verilog表述  3.含异步复位/时钟使能型触发器及其Verilog表述 4.同步复位型触发器及其Verilog表述  5.异步复位型锁存器及其Verilog表述 6.Verilog的时钟过程表述的特点和规律   7.异步时序模块的Verilog表述  8.4位二进制

    2024年02月07日
    浏览(41)
  • 1、verilog语法——模块的结构

    目录 前言 一、什么是模块 二、模块的内容 1.I/O声明的格式 2.内部信号的声明 3.功能定义 三、模块的调用(例化) 要点注意 本次的学习内容是verilog的基本设计单元:模块(module) 模块(module)是verilog设计基本单元。一共由两部分组成:一部分是描述接口,另一部分描述逻辑

    2024年02月08日
    浏览(35)
  • Verilog语法-模块module[Day2学习笔记]

    1概述 Verilog HDL是一种用于数字逻辑电路设计的硬件描述语言,可用来进行数字电路的仿真验证、时序分析、逻辑综合。 用Verilog HDL描述的电路设计就是该电路的Verilog HDL模型。 Verilog HDL既是一种 行为 描述语言,也是一种 结构 描述语言。 既可以用电路的功能描述,也可以用

    2024年02月15日
    浏览(41)
  • 5.3 Verilog 带参数例化

    分类  Verilog 教程 : defparam,参数,例化,ram 当一个模块被另一个模块引用例化时,高层模块可以对低层模块的参数值进行改写。这样就允许在编译时将不同的参数传递给多个相同名字的模块,而不用单独为只有参数不同的多个模块再新建文件。 参数覆盖有 2 种方式

    2024年01月17日
    浏览(32)
  • 【Verilog】二、Verilog基础语法

    文章目录 前言 一、简单的Verilog知识 1.1、Verilog端口定义 1.2、Verilog的标识符 1.3、Verilog的逻辑值 1.4、Verilog的数字进制 1.5、Verilog的数据类型 1.5.1、reg型         1.5.2、wire型 1.5.3、参数类型 1.6、Verilog的运算符 1.6.1、算术运算符 1.6.2、关系运算符 1.6.3、逻辑运算符 1.6.4、条件

    2023年04月09日
    浏览(36)
  • Verilog 基础知识(一) Verilog 基础语法与注意事项

            Verilog中的module可以看成一个具有输入输出端口的黑盒子,该黑盒子有输入和输出接口(信号),通过把输入在盒子中执行某些操作来实现某项功能。(类似于C语言中的函数) 图1  模块示意图 0.1.1 模块描述 图1 所示的顶层模块(top_module)结构用Verilog语言可描述为: 模块

    2024年02月03日
    浏览(43)
  • 记录一下verilog重复例化的两种方式

    0 前言 这段时间例化了挺多mem,过程中也了解到了一些新的东西,在这里记录一下 1 for循环方式例化方法 先给出 sub_module 要将这个module分别例化成 u_sub_0 和 u_sub_1 ,并且每个都例化四次 for循环的实现方式如下 来看看例化后的效果 可以看到,总共4组inst,每组inst中存在两个

    2024年02月11日
    浏览(42)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包