Verilog的模块与端口 语法

本文详细介绍了Verilog中的模块定义与端口概念,包括模块的构成元素、端口的类型及其声明方式,以及端口连接规则等内容。此外,还讲解了如何处理不同数据类型端口的连接问题。

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


模块
模块的定义以关键字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允许端口的内、外两个部分具有不同的位宽。一般情况下,verilog仿真器会对此警告。
未连接端口
Verilog允许模块实例的端口保持未连接的状态。例如,如果模块的某些输出端口只用于调试,那么这些端口可以不与外部信号连接。
端口与外部信号的连接
在对模块调用的时候,可以使用两种方法将模块定义的端口与外部环境中的信号连接起来:按顺序连接以及按名字连接。但两种方法不能混合在一起使用。
顺序端口连接:

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


默认状态,VERILOG为WIRE类型,为了实现REG类型为变量在端口中定义,有二种方式。

1. 显示方式:


// channel 1 out
output reg hdmi_out1_clk,
output reg hdmi_out1_hs,
output reg hdmi_out1_vs,
output reg hdmi_out1_de,
output reg [7 : 0] hdmi_out1_y,
output reg [7 : 0] hdmi_out1_cbcr,

2. 中转方式:

因为变量默认为WIRE类型,利用一个中间变量,使用ASSIGN语句实现REG型到WIRE型的变化。


接口定义

// channel 2 out
output hdmi_out2_clk,
output hdmi_out2_hs,
output hdmi_out2_vs,
output hdmi_out2_de,
output [7 : 0] hdmi_out2_y,
output [7 : 0] hdmi_out2_cbcr,


定义中间变量

// channel 2 for delay 1
reg [7 : 0] hdmi_in2_y_d1;
reg [7 : 0] hdmi_in2_cbcr_d1;
reg hdmi_in2_hs_d1;
reg hdmi_in2_vs_d1;
reg hdmi_in2_de_d1;

赋值中间REG变量到WIRE变量

assign hdmi_out2_hs = hdmi_in2_hs_d1;
assign hdmi_out2_vs = hdmi_in2_vs_d1;
assign hdmi_out2_de = hdmi_in2_de_d1;
assign hdmi_out2_y = hdmi_in2_y_d1;
assign hdmi_out2_cbcr = hdmi_in2_cbcr_d1;


使用REG型的中间变量

// 
// delay 3 clock unit
// 
always @(posedge sys_clk or posedge rst_n) begin
if (rst_n) begin
hdmi_in0_hs_d1 <= 8`b0;
hdmi_in0_vs_d1 <= 8`b0;
hdmi_in0_de_d1 <= 8`b0;
hdmi_in0_y_d1 <= 8`b0;
hdmi_in0_cbcr_d1 <= 8`b0;


hdmi_in1_hs_d1 <= 8`b0;
hdmi_in1_vs_d1 <= 8`b0;
hdmi_in1_de_d1 <= 8`b0;
hdmi_in1_y_d1 <= 8`b0;
hdmi_in1_cbcr_d1 <= 8`b0;


hdmi_in2_hs_d1 <= 8`b0;
hdmi_in2_vs_d1 <= 8`b0;
hdmi_in2_de_d1 <= 8`b0;
hdmi_in2_y_d1 <= 8`b0;
hdmi_in2_cbcr_d1 <= 8`b0;






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值