米联客-FPGA程序设计Verilog语法入门篇连载-08 Verilog语法_模块端口与例化

软件版本:无

操作系统:WIN10 64bit

硬件平台:适用所有系列FPGA

板卡获取平台:https://milianke.tmall.com/

登录"米联客"FPGA社区 http://www.uisrc.com 视频课程、答疑解惑!

1 概述

本小节讲解Verilog语法的模块端口与例化的方法,需要掌握模块的端口的类型,以及有几种例化方式。

2 模块端口

模块在介绍设计方法时有提到子模块,与此概念基本相通,但是在Verilog语法中,模块有一定的格式要求。

module 名字

#(参数列表)

(端口列表) ;

语句块;

endmodule例:

cpp 复制代码
module MUX4_1(

    input [3:0]d,       //MUX输入

    input [1:0]s,       //选择信号

    output reg q

    );

always@(*)

begin

    case(s)

        2'b00:q <= d[0];

        2'b01:q <= d[1];

        2'b10:q <= d[2];

        2'b11:q <= d[3];

        default:q <= 0;

    endcase

end

endmodule  

模块定义必须以关键字 module 开始,以关键字 endmodule 结束。模块名、端口信号、端口声明和可选的参数声明等,出现在设计使用的语句块之前。

每个模块都必须有端口,端口是模块与外界交互的接口。对于外部模块来说,模块内部是不可见的,对模块的使用只能通过端口连接来进行。

端口的方向有三种,分别是input(输入端口)、output(输出端口)和inout(输入输出双向端口),注意端口的声明类型,input、inout 类型不能声明为 reg 数据类型,因为 reg 类型是用于存储数值的,而输入端口只能反映与其相连的外部信号的变化,不能保存这些信号的值。

output 可以声明为 wire 或 reg 数据类型。

端口的声明一般有两种,如下所示。例:

cpp 复制代码
module MUX4_1(

    input wire [3:0]d,

    input wire [1:0]s,

    output reg      q

    );

always@(*)

begin

    case(s)

        2'b00:q <= d[0];

        2'b01:q <= d[1];

        2'b10:q <= d[2];

        2'b11:q <= d[3];

        default:q <= 0;

    endcase

end

endmodule
cpp 复制代码
module MUX4_1(

d,

s,

q

);

input wire [3:0]d;

input wire [1:0]s;

output reg      q;



always@(*)

begin

    case(s)

        2'b00:q <= d[0];

        2'b01:q <= d[1];

        2'b10:q <= d[2];

        2'b11:q <= d[3];

        default:q <= 0;

    endcase

end

endmodule

Verilog语法中,端口默认声明为 wire 型变量不用再次声明端口类型为 wire 型。但是,当端口有 reg 属性时,则 reg 声明不可省略。

3 模块 例化

在一个模块中引用另一个模块,对其端口进行相关连接,叫做模块例化。模块例化建立了描述的层次。信号端口可以通过位置或名称关联,端口连接也必须遵循一些语法规则。

模块例化时端口对应连接的方式有两种,第一种,例化的模块端口与外部信号按照其名字进行连接,端口顺序不一定一致,但要保证端口名字与外部信号匹配。第二种是按照模块声明时端口的顺序与外部信号进行匹配连接,位置要严格保持一致。例:

cpp 复制代码
module MUX4_1(

d,

s,

q

);

input wire [3:0]d;

input wire [1:0]s;

output reg      q;



always@(*)

begin

    case(s)

        2'b00:q <= d[0];

        2'b01:q <= d[1];

        2'b10:q <= d[2];

        2'b11:q <= d[3];

        default:q <= 0;

    endcase

end

endmodule  

第一种:

cpp 复制代码
MUX4_1 u_m4(

.s(data_s),

.d(data_d),

.q(data_q)

);

第二种:

cpp 复制代码
MUX4_1 u_m4(data_d,data_s,data_q);

端口连接时我们需要注意以下几点:

对于输入端口,可以连接 wire 或 reg 型变量。

对于输出端口,必须连接 wire 型变量。

对于输入输出端口,必须连接 wire 型变量。

端口是否可以悬空?output 端口可以悬空时,甚至可以在例化时将其删除。input 端口悬空时,逻辑功能表现为高阻状态。但是,例化时一般不能将悬空的 input 端口删除,否则编译会报错或者告警,一般来说,建议 input 端口不要做悬空处理,一般给定初始常量。

关于位宽匹配,当例化端口与连接信号位宽不匹配时,端口会通过无符号数的右对齐或截断方式进行匹配。

当例化多个相同的模块时,可以使用generate 语句进行多个模块的重复例化。例:

cpp 复制代码
genvar i;

generate

    for(i=1; i<=8; i=i+1)

    begin:gen

        MUX4_1 u_m4(

        .s(data_s[i]),

        .d(data_d[i]),

        .q(data_q[i])

        );

    end

endgenerate
相关推荐
szxinmai主板定制专家1 小时前
【国产NI替代】基于FPGA的32通道(24bits)高精度终端采集核心板卡
大数据·人工智能·fpga开发
HIZYUAN7 小时前
AGM FPGA如何配置上拉或者下拉电阻
fpga开发
∑狸猫不是猫7 小时前
(13)CT137A- 简易音乐盒设计
fpga开发
ThreeYear_s13 小时前
基于FPGA 的4位密码锁 矩阵键盘 数码管显示 报警仿真
fpga开发·矩阵·计算机外设
Anin蓝天(北京太速科技-陈)19 小时前
252-8路SATAII 6U VPX高速存储模块
fpga开发
如何学会学习?21 小时前
2. FPGA基础了解--全局网络
fpga开发
Anin蓝天(北京太速科技-陈)1 天前
271-基于XC7V690T的12路光纤PCIe接口卡
嵌入式硬件·fpga开发
碎碎思1 天前
FPGA新闻速览-WiMi开发基于FPGA的数字量子计算机验证技术
fpga开发·量子计算
hi942 天前
Vivado - 远程调试 + 远程综合实现 + vmWare网络配置 + NFS 文件共享 + 使用 VIO 核
嵌入式硬件·fpga开发·vivado 远程开发·vmware网络配置
超级大咸鱼2 天前
CW信号的正交解调
matlab·verilog·fpga·数字信号·解调·正交解调·cw