verilog基础——模块端口 使用方法总结

本文深入解析Verilog中的模块定义与端口连接规则,包括input、output、inout类型的端口特性,以及端口的数据类型声明和连接方式。阐述了在模块调用时的端口位宽匹配和未连接端口的处理方法,介绍了按顺序和按名字的端口连接技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

版权声明:本文为博主原创文章,未经博主允许不得转载。    https://blog.youkuaiyun.com/dreamdonghui/article/details/76343371
模块

模块的定义以关键字module开始,模块名、端口列表、端口声明和可选的参数声明必须出现在其他部分的前面,endmodule语句必须为模块的最后一条语句。端口是模块与外部环境交互的通道,只有在模块有端口的情况下才需要有端口列表和端口声明。模块内部的5个组成部分是:变量声明、数据流语句、低层模块实例、行为语句块以及任务和函数。


端口

端口是模块与外界环境交互的接口。对外部环境来讲,模块内部是不可见的,对模块的调用只能通过其端口进行。这种特点为设计者提供了很大的灵活性:只要接口保持不变,模块内部的修改并不会影响到外部环境。常将端口成为终端。(terminal)

端口列表:

在模块的定义中包括一个可选的端口列表。如果模块和外部环境没有交换任何信号,则可以没有端口列表。

端口声明

端口列表中的所有端口必须在模块中进行声明,verilog中的端口具有以下三种了类型:input、output、和inout。在verilog中,所有的端口隐含地声明为wire类型,因此如果希望端口具有wire数据类型,将其声明为三种类型之一即可:如果输出类型的端口需要保存数值,则必须将其显式的声明为reg数据类型。

不能将input和inout类型的端口声明为reg数据类型,这是因为reg类型的变量是用于保存数值的,而输入端口只反映与其相连的外部信号的变化,并不能保存这些信号的值。

注意,在verilog中,也可以使用ANSI C风格进行端口声明。这种风格的声明的优点是避免了端口名在端口列表和端口声明语句中的重复。如果声明中未指明端口的数据类型,那么默认端口具有wire数据类型。

如:

module fulladd4(output reg [3:0] sum,

output reg c_out,

input [3:0] a,b,

input c_in);

……

……

endmodule


端口连接规则

将一个端口看成由相互链接的两个部分组成,一部分位于模块内部,另一部分位于模块外部。当在一个模块中调用(实例引用)另一个模块时,端口之间的连接必须遵守一些规则。

输入端口:从模块内部来讲,输入端口必须为线网数据类型,从模块外部来看,输入端口可以连接到线网或者reg数据类型的变量。

输出端口:从模块内部来讲,输出端口可以是线网或者reg数据类型,从模块外部来看,输出必须连接到线网类型的变量,而不能连接到reg类型的变量。

 

调用子模块时 输出端口只能用wire类型变量进行映射 这是verilog语法规定的

不知道你说的“无法实现想要的功能”是指什么 但是如果你需要输出信号是reg类型
可以增加一个wire类型中间变量 再把这个中间变量赋值给一个reg类型变量

wire a;
testmodule tss(dataa,a,clockk);

reg registerr;
always @ *
registerr <= a;

输入/输出端口

从模块内部来讲,输入/输出端口必须为线网数据类型;从模块外部来看,输入/输出端口也必须连接到线网类型的变量。

位宽匹配

在对模块进行调用的时候,verilog允许端口的内、外两个部分具有不同的位宽。一般情况下,verilog仿真器会对此警告。

未连接端口

Verilog允许模块实例的端口保持未连接的状态。例如,如果模块的某些输出端口只用于调试,那么这些端口可以不与外部信号连接。


端口与外部信号的连接

在对模块调用的时候,可以使用两种方法将模块定义的端口与外部环境中的信号连接起来:按顺序连接以及按名字连接。但两种方法不能混合在一起使用。

顺序端口连接:

需要连接到模块实例的信号必须与模块声明时目标端口在端口列表中的位置保持一致。
 

=========================================================================

输入端口可以由wire/reg驱动,但输入端口只能是wire;输出端口可以使wire/reg类型,输出端口只能驱动wire;若输出端口在过程块中赋值则为reg型,若在过程块外赋值则为net型。用关键词inout声明一个双向端口, inout端口不能声明为reg类型,只能是wire类型;输入和双向端口不能声明为寄存器类型。

INOUT引脚:

1.FPGA IO在做输入时,可以用作高阻态,这就是所说的高阻输入;

2.FPGA IO在做输出时,则可以直接用来输入输出。

芯片外部引脚很多都使用inout类型的,为的是节省管腿。就是一个端口同时做输入和输出。 inout在具体实现上一般用三态门来实现。三态门的第三个状态就是高阻'Z'。当inout端口不输出时,将三态门置高阻。这样信号就不会因为两端同时输出而出错了,更详细的内容可以搜索一下三态门tri-state的资料.
1 使用inout类型数据,可以用如下写法:
inout data;
reg data_in;
reg data_out;

//data为输出时
reg en_output;
assign data_inout=en_output?data_out:1'bz;//en_output控制三态门
//对于data_out,可以通过组合逻辑或者时序逻辑根据data对其赋值.通过控制en_output的高低电平,从而设置data是输出数据还是处于高阻态,如果处于高阻态,则此时当作输入端口使用.en_output可以通过相关电路来控制.
2 编写测试模块时,对于inout类型的端口,需要定义成wire类型变量,而其它输入端口都定义成reg类型,这两者是有区别的.
当上面例子中的data_inout用作输入时,需要赋值给data_inout,其余情况可以断开.

此时可以用assign语句实现:assign data_inout=link?data_in_t:1'bz;

其中的link ,data_in_t是reg类型变量,在测试模块中赋值.

另外,可以设置一个输出端口观察data_inout用作输出的情况:
Wire data_out;
Assign data_out_t=(!link)?data_inout:1'bz;

但要注意给data_inout赋值的时候,link选通信号如何给呢?

首先测试文件给源文件的data_inout数据赋值,那只能在原INOUT数据为高阻态的时候才可以赋值,故link信号即该INOUT数据为高阻太时的控制信号。

当不需要测试文件给你data_inout数据赋值的时候,测试文件的data_inout接口因为高阻态,从而不影响源文件data_inout接口的其他操作。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值