为深入理解双向端口的使用,进行本仿真试验,完成一个类似可修改数值的计数器。en_set为0时,双向IO口bio 输出模块内部计数器cnt的计数值;en_set为1时,bio输入数值对内部计数器cnt进行设置。主模块定义如下:
module stg
#
(
parameter WIDTH = 7
)
(
input clk ,
input rst_n ,
inout [WIDTH:0] bio ,
input en_set
);
bio为双向IO:
1)en_set为1时bio为输入口,将输入的数值赋值到cnt;
2)en_set为0时bio为输出口,输出cnt的数值。
`timescale 1ns/1ps
module stg
#
(
parameter WIDTH = 7
)
(
input clk ,
input rst_n ,
inout [WIDTH:0] bio ,
input en_set
);
reg [WIDTH:0] cnt;
always @(posedge clk or negedge rst_n) begin
if(~rst_n)
cnt <= 'd0;
else if(en_set == 1'b1)
cnt <= bio;
else
cnt <= cnt + 'd1;
end
assign bio = (en_set == 1'b1) ? 'bz : cnt;
endmodule
`timescale 1ns/1ps
module tb_stg;
reg clk ;
reg rst_n ;
wire [7:0] bio ;
reg en_set ;
stg
#
(
.WIDTH (7 )
)
u_stg
(
.clk (clk ) ,
.rst_n (rst_n ) ,
.bio (bio ) ,
.en_set (en_set )
);
initial begin
rst_n = 0;
clk = 0;
en_set = 0;
#100;
rst_n = 1;
#1000;
en_set = 1;
#100;
en_set = 0;
end
always #10 clk = ~clk;
assign bio = (en_set == 1'b1) ? 7'h68 : 7'hzz;
endmodule
因篇幅问题不能全部显示,请点此查看更多更全内容