问答 店铺
热搜: ZYNQ FPGA discuz

QQ登录

只需一步,快速开始

微信登录

微信扫码,快速开始

微信扫一扫 分享朋友圈

已有 36 人浏览分享

开启左侧

第八课 Verilog 语法_模块端口与例化

[复制链接]
36 0
AMD-FPGA课程
AMD课程: 04-FPGA语法和硬件基础 » X
1 概述
      本小节讲解 Verilog 语法的模块端口与例化的方法,需要掌握模块的端口的类型,以及有几种例化方式。


2 模块端口
      模块在介绍设计方法时有提到子模块,与此概念基本相通,但是在 Verilog 语法中,模块有一定的格式要求。
      module 名字
      #(参数列表)
      (端口列表) ;
           语句块;
      endmodule 例:
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(输入输出双向端口),注意端口的声明类型,inputinout 类型不能声明为 reg 数据类型,因为 reg 类型是用于存储数值的,而输入端口只能反映与其相连的外部信号的变化,不能保存这些信号的值。
       output 可以声明为 wire 或 reg 数据类型。

       端口的声明一般有两种,如下所示。例:
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


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 模块例化
       在一个模块中引用另一个模块,对其端口进行相关连接,叫做模块例化。模块例化建立了描述的层次。信号端口可以通过位置或名称关联,端口连接也必须遵循一些语法规则。
       模块例化时端口对应连接的方式有两种,第一种,例化的模块端口与外部信号按照其名字进行连接,端口顺序不一定一致,但要保证端口名字与外部信号匹配。第二种是按照模块声明时端口的顺序与外部信号进行匹配连接,位置要严格保持一致。例:
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
第一种:
MUX4_1 u_m4(
.s(data_s),
.d(data_d),
.q(data_q)
);
第二种:
MUX4_1 u_m4(data_d,data_s,data_q);
       端口连接时我们需要注意以下几点:
       对于输入端口,可以连接 wire 或 reg 型变量。
       对于输出端口,必须连接 wire 型变量。
       对于输入输出端口,必须连接 wire 型变量。
       端口是否可以悬空?output 端口可以悬空时,甚至可以在例化时将其删除。input 端口悬空时,逻辑功能表现为高阻状态。但是,例化时一般不能将悬空的 input 端口删除,否则编译会报错或者告警,一般来说,建议 input 口不要做悬空处理,一般给定初始常量。
       关于位宽匹配,当例化端口与连接信号位宽不匹配时,端口会通过无符号数的右对齐或截断方式进行匹配。
       当例化多个相同的模块时,可以使用 generate 语句进行多个模块的重复例化。例:
genvar i;
generate
for(i=1; i<=8; i=i+1)
begin:gen
MUX4_1 u_m4(
.s(data_s),
.d(data_d),
.q(data_q)
);
end
endgenerate



您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

0

关注

10

粉丝

114

主题
精彩推荐
热门资讯
    网友晒图
      图文推荐
        
        • 微信公众平台

        • 扫描访问手机版