方法一:使用双向端口缓冲器(OBUFT)
当您只想将双向端口信号作为输入端口处理时,可以使用双向端口缓冲器(如 OBUFT
)来隔离顶层模块中的信号与子模块中的双向端口信号。
示例代码
假设您有一个模块 sd_ctrl
,其中包含一个双向端口信号 sdio
,并且您希望在顶层模块 top
中例化 sd_ctrl
并将 sdio
仅作为输入端口来处理。
1module top (
2 input wire clk,
3 input wire rst,
4 input wire sdio_top // 需要连接到双向端口的信号
5);
6
7 // 例化 sd_ctrl 模块
8 wire sdio; // 定义一个中间信号
9 sd_ctrl u_sd_ctrl (
10 .clk(clk),
11 .rst(rst),
12 .sdio(sdio) // 连接到双向端口信号
13 );
14
15 // 使用双向端口缓冲器
16 OBUFT #(
17 .IOSTANDARD("LVCMOS18")
18 ) obuft_inst (
19 .O(sdio_top), // 输出端口,连接到顶层信号
20 .I(sdio), // 输入端口,连接到 sdio 信号
21 .T(1'b0) // 方向控制信号,设置为输入模式
22 );
23
24endmodule
方法二:使用单向端口缓冲器(OBUF + BUFG)
如果您不想使用双向端口缓冲器,也可以通过使用单向端口缓冲器(如 OBUF
和 BUFG
)来实现类似的功能。
示例代码
1module top (
2 input wire clk,
3 input wire rst,
4 input wire sdio_top // 需要连接到双向端口的信号
5);
6
7 // 例化 sd_ctrl 模块
8 wire sdio; // 定义一个中间信号
9 sd_ctrl u_sd_ctrl (
10 .clk(clk),
11 .rst(rst),
12 .sdio(sdio) // 连接到双向端口信号
13 );
14
15 // 使用单向端口缓冲器
16 OBUF oobuf_inst (
17 .O(sdio_top), // 输出端口,连接到顶层信号
18 .I(sdio) // 输入端口,连接到 sdio 信号
19 );
20
21endmodule